题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
思路:每确定一个数,后面一个数肯定比它大。所以可以先从最后一个数开始,不断向前确定前面的状态,推导出
状态转移方程为:dp[i] = dp[i]+max(dp[j]) (j<i&&a[j]<a[i])。
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> using namespace std; const int maxn = 1200; int a[maxn],dp[maxn]; int main(void) { int i,j,n; while(~scanf("%d",&n)&&n) { for(i=0;i<n;i++) scanf("%d",&a[i]); for(i=0;i<n;i++) dp[i]=a[i]; for(i=n-2;i>=0;i--) { int tp=0; for(j=i+1;j<n;j++) { if(a[j]>a[i]&&dp[j]>tp) tp=dp[j]; } dp[i]+=tp; } int ans=0; for(i=0;i<n;i++) { if(ans<dp[i]) ans=dp[i]; } printf("%d ",ans); } return 0; }