zoukankan      html  css  js  c++  java
  • hdu 1003

      题目大意就是给你一个区间,要你求区间的最大和,以及对应的起点和终点。这题是简单的dp,状态定义的话就是dp[i]表示以a[i]结尾的区间的最大和,并且用qj[i]表示对应的区间的起点和终点,边界的话注意一下,dp【0】要初始化为0,因为0前面根本不存在元素,状态转移:dp[i]=max(dp[i-1]+a[i],a[i]),表示的是以a[i]结尾的区间的最大和可能是接由i-1位置的最大区间和转移来,也可能是由其本身转移来,可以理解为a[i]可以连着a[i-1]对应的区间,也可以a[i]一个数作为一个区间.

    #include<bits/stdc++.h>
    using namespace std;
    #define pii pair<int,int>
    #define inf 0x3f3f3f3f
    const int maxn=1e5+10;
    pii qj[maxn];
    pii ans;
    int maxx;
    int dp[maxn],a[maxn];
    int main()
    {
        int icase=0;
        int t;
        cin>>t;
        while(t--)
        {
            icase++;
            int n;
            cin>>n;
            for(int i=1;i<=n;i++)
                cin>>a[i];
            dp[0]=0;
            maxx=-inf;
            for(int i=1;i<=n;i++)
            {
                if(dp[i-1]+a[i]>=a[i])
                {
                    dp[i]=dp[i-1]+a[i];
                    qj[i].first=qj[i-1].first;
                    qj[i].second=i;
                }
                else
                {
                    dp[i]=a[i];
                    qj[i].first=i;
                    qj[i].second=i;
                }
                if(i==1)
                    qj[i].first=1;
            }
            for(int i=1;i<=n;i++)
            {
                if(dp[i]>maxx)
                {
                    maxx=dp[i];
                    ans.first=qj[i].first;
                    ans.second=qj[i].second;
                }
    
            }
            cout<<"Case "<<icase<<":"<<endl;
            cout<<maxx<<" "<<ans.first<<" "<<ans.second<<endl;
            if(t!=0)
                cout<<endl;
                
    
    
        }
        return 0;
    }
    
  • 相关阅读:
    将一堆图片自适应页面排列
    用正则匹配富文本中的文本,并替换其内容
    实战
    从 defineProperty 到 Proxy
    CSS 实现蜂巢/六边形图集
    Umi 小白纪实(三)—— 震惊!路由竟然如此强大!
    无题
    贺文
    模型可解释性方法--lime
    多模态融合注记
  • 原文地址:https://www.cnblogs.com/eason9906/p/11754950.html
Copyright © 2011-2022 走看看