super,jumping!jumping!jumping!做题总结

题目:

 题目就不去翻译了,直接说说我自己对题目的看法吧

大致意思就是:有多组输入,每一组能输入N个数字(1<=N<=1000)。在每一组的数字串中找出一个递增子序列(该子序列等于或包含于原数字串),使得该递增子序列的元素相加之和最大。

下面是input和output的要求:

super,jumping!jumping!jumping!做题总结_第1张图片

 

从这里我们不难发现,结束输入的一个条件即下一行第一个输入的数字为0,通过这个条件我们能写出这一串数据的输入终止条件了。

其实因为我刚接触动态规划,用的很不熟练就一开始写出了下面这玩意(水平有限)

我一开始的想法是:在每一个case里面有N个数字,a[1]~a[n],从最初开始我能跳到第i个数字,然后再找它的不断点连续递增序列,但是这样是有很大问题的。比如,sample(5 1 5 2 3 4),这个的输出就会有问题,因为这里是能够跳点的,即能从a[k]跳到a[k+j],j>1。

发现问题后就去学习了,向大佬学习后就写出来了下面的代码。

#include
#include
using namespace std;
int v[1010];
int s[1010];//意思是前i项的最大递增顺序和 
int m[1010];
int main(){
    int n,num=1;
    while(cin>>n){
        if(n==0) break;
        for(int i=1;i<=n;i++){
            cin>>v[i];
        }
        s[1]=v[1];
        for(int i=2;i<=n;i++){
            int maxsum=0;
            s[i]=v[i];
        for(int j=1;j<=i-1;j++){
            if(v[j]                 if(maxsum                 maxsum=s[j];//不断更新maxsum使得在i之前取到了最大值 
            }
        }
        s[i]=v[i]+maxsum;
        m[num]=*max_element(s+1,s+n+1);//这个函数*max_element(s+1,s+n+1)返回值是指针哦。
        }//同时记住用这个函数需要引用algorithm。
        num++;
    }
    for(int i=1;i<=num-1;i++){
    cout<     }
    return 0;

我这里定义了两个数组,v[]是用来输入数字value的,s[]是用来累加的,s[j]意为:数组中到第j个元素的递增序列的元素和的最大值。在动态规划中我们可以把它看成一个状态,所以当要到第i(i>j)个元素时,我们只需要在满足条件(a[j]

你可能感兴趣的:(基础算法学习,算法)