动态规划—Problem C
题意
下棋。每颗棋子有不同的数值,要求只能从数值小的棋子走向比它大的棋子,如果下一颗棋子比它小就不能继续走了。求此过程中所走棋子代表的数的最大值。
解题思路
题目一大串,说白了就是个求最大递增子序列和。明白问题的实质后再做就不难了,明确状态方程就行:sum[j]=max{sum[i]}+a[j]; 其中,0<=i<=j,a[i]
#include<iostream>
using namespace std;
#define MAX 1010
int main()
{
int num[MAX],dp[MAX];
int n,i,j;
while( cin>>n,n )
{
for(i=0;i<n;i++)
cin>>num[i];
dp[0]=num[0];
for(i=1;i<n;i++)
{
dp[i]=num[i];
for(j=0;j<i;j++)
{
if(num[j]<num[i] && dp[j]+num[i]>dp[i])
dp[i]=num[i]+dp[j];
}
}
int max=0;
for(i=1;i<n;i++)
{
if(dp[i]>max) max=dp[i];
}
cout<<max<<endl;
}
}