1003 Problem C
题意:一个棋盘中,棋子都被标记正整数,要求从0位置开始,达到最大值,求做经过的棋子的和的最大值。
思路:要求经过棋子的和的最大值,这题类似于最大子序列问题,而对于要求的最大子序列,关键f[i]=max{f[j]}+a[i],其中f[i]为当前值,f[j]为序列的前一个值。
感想:一上来,思考太片面,直接判断前后两个值的大小,然后加入到序列中,计算最后结果,然后wrang,再次读题思考后,才明白,这样可能得到的并不是最大的子序列。
#include<iostream>
using namespace std;
int main(){
int n,i,j,s;
int a[1001],f[1001];
while(cin>>n&&n!=0){
for(i=0;i<n;i++){
cin>>a[i];
f[i]=a[i];
}
s=f[0];
for(i=0;i<n;i++){
for(j=0;j<i;j++){
if(a[j]<a[i]&&(f[i]<f[j]+a[i]))
f[i]=f[j]+a[i];
if(s<f[i]) s=f[i];
}
}
cout<<s<<endl;
}
return 0;
}