简单的dp,最优子结构是dp[i],即从0~i来看,是的dp[i]最大,然后找到最大中的最大就可以了,
转移方程是:dp[i]=max{dp[i],dp[j]+value[i]},注意这里有两个判断条件。
#include"iostream" #include"stdio.h" #include"string.h" #include"algorithm" #define mx 1010 using namespace std; __int64 n; __int64 value[mx]; __int64 dp[mx]; int main() { __int64 i,j,ans; while(cin>>n,n) { for(i=1;i<=n;i++) cin>>value[i]; memset(dp,0,sizeof(dp)); value[0]=0; ans=0; for(i=1;i<=n;i++) { for(j=0;j<i;j++) { if(value[j]<value[i]) { if(dp[j]+value[i]>dp[i]) dp[i]=dp[j]+value[i]; if(dp[i]>ans) ans=dp[i]; } } } cout<<ans<<endl; } return 0; }