【最长上升子序列】HDU 1087——Super Jumping! Jumping! Jumping!
来源:点击打开链接
最长上升子序列的考察,是一个简单的DP问题。我们每一次求出从第一个数到当前这个数的最长上升子序列,直至遍历到最后一个数字为止,然后再取dp数组里最大的那个即为整个序列的最长上升子序列。我们用dp[i]来存放序列1-i的最长上升子序列的长度,那么dp[i]=max(1,dp[j])+1,(j∈[1, i-1]); 显然dp[1]=1,我们从i=2开始遍历后面的元素即可。
这个没有优化,效率是O(N^2),可以通过二分进行进一步的优化。
#include <iostream> #include <cstring> using namespace std; int dp[1009]; int a[1009]; int lis(int n) { int sum=0; dp[0]=a[0]; for(int i=1;i<n;i++) { dp[i]=a[i]; for(int j=0;j<i;j++) { if(a[i]>a[j] && dp[i]<dp[j]+a[i]) { dp[i]=dp[j]+a[i]; } if(sum<dp[i]) sum=dp[i]; } } return sum; } int main() { int testcase; while(cin>>testcase && testcase!=0) { memset(dp,0,sizeof(dp)); memset(a,0,sizeof(a)); for(int i=0;i<testcase;i++) { cin>>a[i]; } cout<<lis(testcase)<<endl; } return 0; }