题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1087
经典dp的一个小变形,用dp[i]表示第i个位置上的max,则dp[i]=a[i]+dp]j],(a[j]<a[i]&&max(dp[j])),然后输出max(dp)即可;
//代码中含全角空格
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
const int N=1010;
int n,a[N];
long long dp[N],maxn;
int main()
{
while(cin>>n&&n){
for(int i=0;i<n;i++)
cin>>a[i];
maxn=-1;
memset(dp,0,sizeof(dp));
for(int i=0;i<n;i++){
long long tmp=0;
for(int j=i-1;j>=0;j--)
if(a[j]<a[i])tmp=max(dp[j],tmp);//找max(dp[j]) <span style="font-family: Arial; font-size: 14px; line-height: 26px;">a[j]<a[i]&&max(dp[j])</span>
dp[i]+=(tmp+a[i]);
maxn=max(dp[i],maxn);
}
printf("%I64d\n",maxn);
}
return 0;
}
本文解析了一道经典的DP变形题目,通过动态规划求解最大累积值。利用dp数组记录每个位置的最大值,并通过遍历寻找最优解。
1186

被折叠的 条评论
为什么被折叠?



