zoukankan      html  css  js  c++  java
  • HDU

    最近刷题突然发现vj上还有几道很久以前的attempt题没有解决,所以就当水题把这些题补了....

    原题链接

    题意:

    求给出序列的最大连续子序列,同时输出其区间 (如果有相同的最大值区间,输出 i , j 最小的区间)

    思路:

    求最大连续子序列:递推公式 dp[i] = max ( arr[i] , dp[i-1] + arr[i] ) , 表示以 i 结尾的最大连续子序列和。 最后遍历一遍 输出最大 dp 值即可.

    关于区间范围我们 就写个结构体记录一下即可,在递推时候进行更新。

    code:

    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    using namespace std;
    #define maxn 10005
    const int inf = 0x3f3f3f3f;
    struct node{
        int l,r;
        int val;
    }dp[maxn];
    int arr[maxn];
    int main()
    {
        int n,mmax,flag;
        while(cin>>n&&n)
        {
            mmax=-inf , flag=0;
            for(int i=1;i<=n;i++){
                cin>>arr[i];
                if(arr[i]>=0)flag=1;
            }
             //若所有K个元素都是负数,则定义其最大和为0,输出整个序列的首尾元素 
            if(!flag){
                cout<<0<<" "<<arr[1]<<" "<<arr[n]<<endl;
                continue;
            }
            //最大连续序列和dp
            dp[0].l = 1;
            for(int i=1;i<=n;i++){
                if(arr[i]>dp[i-1].val+arr[i]){
                    dp[i].val = arr[i];
                    dp[i].l = i;
                    dp[i].r = i;
                }else{
                    dp[i].val = dp[i-1].val + arr[i];
                    dp[i].l = dp[i-1].l;
                    dp[i].r = i;
                }
                mmax=max(dp[i].val,mmax);
            }
            int l,r;
            for(int i=1;i<=n;i++){
                if(dp[i].val==mmax){
                    cout<<mmax<<" "<<arr[dp[i].l]<<" "<<arr[dp[i].r]<<endl;
                    break;
                }
            }    
        }
        return 0;
    }
  • 相关阅读:
    纪念时至今日才学会的命令行
    面向对象程序设计寒假作业2
    面向对象程序设计寒假作业1
    POJ 2104 K-th Number
    HihoCoder 1325 平衡树·Treap
    HihoCoder 1079 离散化
    POJ 2135 Farm Tour
    Luogu P1231 教辅的组成
    洛谷 P3410 拍照
    洛谷 P3370 【模板】字符串哈希
  • 原文地址:https://www.cnblogs.com/Tianwell/p/11586415.html
Copyright © 2011-2022 走看看