题目意思:
http://acm.hdu.edu.cn/showproblem.php?pid=1087
此题的意思求最长上升子序列的和。
题目分析:
在求最长上升子序列的时候,不在保存最长的个数,而是保存他们的和即可。
AC代码:
/** *最长上升子序列问题+保存得到的分数 */ #include<iostream> #include<cstdio> #include<map> #include<cstring> #include<string> #include<algorithm> #include<queue> #include<vector> #include<stack> #include<cstdlib> #include<cctype> #include<cstring> #include<cmath> using namespace std; int a[1005],dp[1005]; int LIS(int n,int a[]){//O(n*n) int ma=0; for(int i=0;i<n;i++){ dp[i]=a[i]; if(ma<dp[i]) ma=dp[i]; for(int j=0;j<i;j++){ if(a[j]<a[i]&&dp[j]+a[i]>dp[i]){ dp[i]=dp[j]+a[i]; if(ma<dp[i]) ma=dp[i]; } } } return ma; } int main() { int n; while(cin>>n&&n){ for(int i=0;i<n;i++) cin>>a[i]; cout<<LIS(n,a)<<endl; } return 0; }
HDU1087 Super Jumping! Jumping! Jumping!(LIS)
原文地址:http://blog.csdn.net/fool_ran/article/details/42083387