zoukankan      html  css  js  c++  java
  • hdu 1003 Max Sum(动态规划)

    解题思路:

    本题在给定的集合中找到最大的子集合【子集合:集合的元素的总和,是所有子集合中的最大解。】

    结果输出: 最大的子集合的所有元素的和,子集合在集合中的范围区间.

    依次对元素相加,存到一个 sum 中,同时ans=sum;定义左右边界 left,right;临时左边界ll=1;

    如果sum>ans,则ans=sum; 左边界 left=tem; right=i+1;

    如果sum<0,则sum=0; tem=i+2;

    Ac code:

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int main()
     4 {
     5     int t,a,sum,ans,l,r,x,ll;
     6     scanf("%d",&t);
     7     for(int k=1; k<=t; k++)
     8     {
     9         sum=0;ans=-10000;ll=1;
    10         scanf("%d",&x);
    11         for(int i=0; i<x; i++)
    12         {
    13             scanf("%d",&a);sum+=a;
    14             if(sum>ans)
    15             {ans=sum;l=ll;r=i+1;}
    16             if(sum<0)
    17             {sum=0;ll=i+2;}
    18         }
    19         printf("Case %d:
    %d %d %d
    ",k,ans,l,r);
    20         if(k!=t)printf("
    ");
    21     }
    22     return 0;
    23 }

     简单DP: 2017.03.29

     1 #include<stdio.h>
     2 #include<algorithm>
     3 #include<string.h>
     4 using namespace std;
     5 #define N 100005
     6 int dp[N];
     7 int a[N];
     8 int main()
     9 {
    10     int t;
    11     while(scanf("%d",&t)!=EOF)
    12     {
    13         int c=1,T=t;
    14         while(t--)
    15         {
    16             memset(dp,0,N);
    17             int n;
    18             scanf("%d",&n);
    19             for(int i=1; i<=n; i++)
    20                 scanf("%d",&a[i]);
    21             dp[1]=a[1];
    22             for(int j=2; j<=n; j++)
    23                 dp[j]=max(dp[j-1]+a[j],a[j]);
    24 
    25             int mx=-999999999;
    26             int st=0,en=0;
    27             for(int i=1; i<=n; i++)
    28                 if(mx<dp[i])
    29                 {
    30                     mx=dp[i];
    31                     en=i;
    32                 }
    33             st=en;
    34             int sum=0;
    35             for(int i=en; i>=1; i--)
    36             {
    37                 sum+=a[i];
    38                 if(sum==mx)
    39                     st=i;
    40             }
    41             printf("Case %d:
    %d %d %d
    ",c,mx,st,en);
    42             if(c!=T)printf("
    ");
    43             c+=1;
    44         }
    45     }
    46     return 0;
    47 }
  • 相关阅读:
    Windows系统下八大具有高逼格的DOS命令之一【ping】
    NOIP初赛 之 逻辑运算
    动态规划 —— 背包问题一 专项研究学习
    使用前端原生 js,贪吃蛇小游戏
    纯html+css制作3D立方体和动画效果
    css3实现3D动画轮播图
    原生js的弹力小球
    小球的问题
    早期练手:功能相对比较完善的 js 计算器
    自动布局简介
  • 原文地址:https://www.cnblogs.com/A--Q/p/5738825.html
Copyright © 2011-2022 走看看