该题的题意为: 对于一些点集合,有起点和终点并且除了这两个点之外,其他点都具有对应的价值.可行的行走策略为: 从一点走到下一点,下一个点必须具有比上一点大的价值,否则不能执行该步.对于起点和终点,这两个点无价值,必须经过这两个点.实际上,这两个点并没有什么用处.
这题我使用DP来解答.如果有其他的方法,欢迎留言.
转移方程为 : dp[i] = max(dp[i],dp[j]+a[i]) (0 < j < i);
该转移方程生效的条件为 当前 a[i] > a[j]; 其中a[i]为读入的数字序列.
值得注意的是,由于状态转移时需要用到dp[i],其初始值应当为a[i];
#include <iostream>
#include <stdio.h>
#include <string.h>
const int MAXN = 1005;
int dp[MAXN],num[MAXN],N;
using namespace std;
int max(int a,int b);
int main()
{
// freopen("1.txt","r",stdin);
while(scanf("%d",&N) && N )
{
for(int i = 0; i < N; i++)
scanf("%d",num+i);
// memset(dp,0,sizeof(dp));
for(int i = 0; i < N; i++)
dp[i] = num[i];
int m = dp[0];
for(int i = 1; i < N; i++)
for(int j = 0; j < i; j++)
{
if(num[i] > num[j])
dp[i] = max(dp[i],dp[j]+num[i]);
m = m > dp[i] ? m : dp[i];
}
printf("%d\n",m);
}
return 0;
}
int max(int a,int b)
{
return a > b ? a : b;
}