题意
wsw获得了与小姐姐约会的机会,同时也不用担心wls会发现了,可是如何选择和哪些小姐姐约会呢?wsw希望自己可以循序渐进,同时希望挑战自己的极限,我们假定每个小姐姐有一个“攻略难度值”
从攻略成功第一个小姐姐开始,wsw希望每下一个需要攻略的小姐姐难度更高,同时又希望攻略难度值之和最大,好了,现在小姐姐们排成一排,wsw只能从左往右开始攻略,请你帮助他找到最大的攻略难度和
解题
设dp[i]表示以第i个小姐姐为结尾的攻略难度和。
状态转移方程为:
dp[i]=max{dp[i],dp[j]+a[i]},j小于i且a[j]小于a[i]。
a[i]表示攻略第i个小姐姐的难度。
AC代码
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
#include<stack>
#include<queue>
using namespace std;
int A[2000];
int dp[2000];
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==0) break;
for(int i=1;i<=n;i++)
scanf("%d",&A[i]);
dp[0]=0;
for(int i=1;i<=n;i++)
{
dp[i]=-1;
for(int j=0;j<i;j++)
{
if(A[i]>A[j])
dp[i]=dp[i]<dp[j]+A[i]?dp[j]+A[i]:dp[i];
}
}
int max_h=0;
for(int i=0;i<=n;i++)
{
max_h=max_h<dp[i]?dp[i]:max_h;
}
printf("%d\n",max_h);
}
}