和最长上升子序列很相似,只不过这题求的是最长上升子序列和
所以定义dp[i] = 以a[i]为末尾的最长上升子序列的和。 其中以a[i]结尾的子序列可能是只包含a[i]的子序列,也可能是在满足j<i并且a[j]<a[i]的以a[i]为结尾的子序列。
因为影响决策的因素为子序列的两端,所以用二重循环递推
所以状态方程为dp[i] = max(dp[i],dp[j]+a[i]) 。
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; int n,a[1005],dp[1005]; int main(){ while(~scanf("%d",&n)&&n){ for(int i=1;i<=n;i++) scanf("%d",&a[i]); long long res = 0; for(int i=1;i<=n;i++){ dp[i] = a[i]; for(int j=1;j<i;j++){ if(a[j]<a[i]){ dp[i] = max(dp[i],dp[j]+a[i]); } } if(res<dp[i]) res = dp[i]; } printf("%lld\n",res); } return 0; }
Super Jumping! Jumping! Jumping!(HDU1087)
原文地址:http://blog.csdn.net/weizhuwyzc000/article/details/45789505