概述
题意略。
本题考查动态规划,顺便考查一下优化。
这个题目可以归约到最长递增子序列那一类,定义状态:dp[i][j] --- 当前以第i个数结尾,前一个数是第j个数的最长序列。
if(a[i] == a[k]) dp[i][j] = dp[j][k] + 1;
这里不用再去枚举k了,因为从小到大枚举j时可以顺便寻找k。
#include<bits/stdc++.h> #define maxn 4050 #define maxn2 1000005 using namespace std; int dp[maxn][maxn],store[maxn]; int maxx[maxn2]; int main(){ int n,ans = 0; scanf("%d",&n); for(int i = 1;i <= n;++i){ scanf("%d",&store[i]); } dp[0][0] = 1; for(int i = 1;i <= n;++i){ int k = -1; for(int j = 0;j < i;++j){ if(k == -1){ if(j > 0) dp[i][j] = 2; else dp[i][j] = 1; } else{ dp[i][j] = max(dp[i][j],dp[j][k] + 1); } if(j > 0 && store[i] == store[j]) k = j; ans = max(ans,dp[i][j]); } } printf("%dn",ans); return 0; } /* 10 1 3 2 4 5 2 6 2 5 6 */
转载于:https://www.cnblogs.com/tiberius/p/8489070.html
最后
以上就是真实鲜花为你收集整理的Codeforces 255C的全部内容,希望文章能够帮你解决Codeforces 255C所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复