分析:
题意就是,在一个数组里找递增的子序列的最大和,而且子序列元素可以不相邻。
我先上一个错误代码,这是我刚看完题后一分钟就写的,事实上没想象中简单,等会我分析一下错误原因
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1001];
int m[1001];
int main(){int n,i,j;while(cin>>n){if(n==0) return 0;for(i=1;i<=n;++i){cin>>a[i]; //把数存到数组里}m[1]=a[1];for(i=2;i<=n;++i){m[i]=a[i];//m[i]是以第i个数为结尾的最大和//这里先初始化,因为m[i]最小就是a[i],所以把初始值定为a[i]。for(j=i-1;j>=1;--j){if(a[j]<a[i]&&a[j]>0){//如果i之前,有比a[i]小的数a[j],就把他的m[j]加到m[i]上m[i]+=m[j];break;}}}cout<<*max_element(m+1,m+n+1)<<endl;}}
错误原因:
我以为如果a[i]大于a[i-1],那a[i]+m[i-1]就是m[i]了,事实上,也许i之前有更大的m,他加上a[i]后,会大于a[i]+m[i-1]。那,我现在就需要找出i之前最大的m,让他加上a[i]不就好了
ac答案
短暂的思考了一分钟,我写出了下面的代码,然后就AC了
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[1001];
int m[1000];
int main(){int n,i,j,ma;while(cin>>n){if(n==0) return 0;for(i=1;i<=n;++i){cin>>a[i]; }m[1]=a[1];for(i=2;i<=n;++i){m[i]=a[i];ma=0;//由于a[i]在变,所以每次最大值都不一样,需要重新遍历,先把ma初始化一下for(j=1;j<=i-1;++j){//从1开始,还是从i-1开始,都一样,因为我都需要全部遍历一遍,才能找到最大的m[j],这里我用ma存那个最大值if(a[j]<a[i]){//a[j]比a[i]小,那么m[i]=a[i]+m[j] 用ma存m[j]if(ma<m[j] ) ma=m[j];//循环完之后,ma存的是所有 m[j]中最大的 }}m[i]=a[i]+ma;//加上a[i]就ok了}cout<<*max_element(m+1,m+n+1)<<endl;//找数组m中最大的元素}}