简单题意
给你个棋盘,棋盘上有数字,不过只能走比当前数字大的地方,求出从起点到终点,能走过最大数字和。
解题思路形成过程
这个不就是老师讲的求最大上升子序列和,的那个题吗,看到英文比较长就没想看,看了之后其实一开始没看懂(英文一般般),真是换汤不换药,思想就是,假设以当前数为结尾,那么最优就是,前面最优加上当前数。最后再求出这些不同结尾的序列的最大值。
感想
细节问题处理不好错了两次
AC代码
#include<iostream>
#include<string.h>
#include<fstream>
using namespace std;
int a[1010];
int dp[1002];
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int n;
while(cin>>n&&n){
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)cin>>a[i];
int big=-1;
for(int i=1;i<=n;i++){
int temp=0;
for(int j=i-1;j>0;j--){
if(a[j]<a[i]&&temp<dp[j])temp=dp[j];
}
dp[i]+=a[i]+temp;
big=max(big,dp[i]);
}
cout<<big<<endl;
}
return 0;
}