Description
有一排棋子,每枚棋子有一个得分,玩家每次只能从左往右跳而且每次只能跳比当前棋子分数大的棋子上去,问最后玩家能够得到的最高分是多少
Input
多组输入,每组用例占一行包括棋子个数n和n枚棋子的得分,以n=0结束输入
Output
对于每组用例,输出玩家最后能够得到的最高分数
Sample Input
3 1 3 2
4 1 2 3 4
4 3 3 2 1
0
Sample Output
4
10
3
Solution
最长上升子序列,令dp[i]为以第i枚棋子作为子序列终点所能得到的最高分数,那么dp[i]=max(dp[i],dp[j]+a[i])(j=1,2…,i),显然当计算到dp[i]是,所有dp[j]都已经求出,所以转移方程可行,因此枚举序列终点i更新最高得分ans=max(ans,dp[i])即可
Code
#include<cstdio>
#include<iostream>
using namespace std;
int main()
{
int a[1111],n,dp[1111];
while(scanf("%d",&n),n)
{
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
dp[1]=a[1];
int ans=dp[1];
for(int i=1;i<=n;i++)
{
int sum=a[i];
for(int j=1;j<=i;j++)
if(a[i]>a[j])
sum=max(sum,dp[j]+a[i]);
dp[i]=sum;
ans=max(ans,dp[i]);
}
printf("%d\n",ans);
}
return 0;
}