导弹拦截(dp复习)
题目描述:求最长下降子序列的长度
in:
7
1 7 3 5 9 4 8
out:
4
解释:1 3 4 8/1 3 5 8
长度为四
这让我想到了hdu上导弹拦截那道题,是求最长上升子序列长度
其转移方程为:
dp[i]=max(dp[i],dp[j]+1);
如果a[j]<a[i],那么dp[i]就应该取dp[i]和dp[j]+1的最大值,由于是正序,j<i保证了dp[j]已经是j时的最优解
#include <iostream> #include<cstring> using namespace std; int dp[10000],n; int a[10000]; int dliworth(int n) { int total=0; for(int i=0;i<n;i++) { dp[i]=1; for(int j=0;j<i;j++) if(a[j]<a[i]) dp[i]=max(dp[i],dp[j]+1); total=max(total,dp[i]); } return total; } int main() { while(cin>>n) { for(int i=0;i<n;i++) cin>>a[i]; cout<<dliworth(n)<<endl; memset(a,0,sizeof(a)); memset(dp,0,sizeof(dp)); } return 0; }