HDU_1003Max Sum 简单动归

以前做过这道题目,那是还不懂状态方程。乱搞一气:

 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn=5000+10;
 5 int a[maxn];
 6 int main()
 7 {
 8     int  T;
 9     scanf("%d",&T);
10     for(int i=1;i<=T;i++)
11     {
12         int n;
13         scanf("%d",&n);
14         for(int j=0;j<n;j++)
15             scanf("%d",&a[j]);
16         int maxd=a[0];
17         int temp=a[0];
18         int left=0;
19         int right=0;
20         int x=0;
21         for(int j=1;j<n;j++)
22         {
23             if(temp+a[j]<a[j])
24             {
25 //                left=right=j;//刚开始这里错了,不能直接转过去,先存到x中
26                 temp=a[j];
27                 x=j;
28             }
29             else
30                 temp+=a[j];
31             if(temp>maxd)
32             {
33                 maxd=temp;
34                 left=x;
35                 right=j;
36             }
37         }
38         printf("Case %d:\n",i);
39         printf("%d %d %d\n",maxd,left+1,right+1);
40         if(i!=T);
41         printf("\n");
42     }
43 }

后来的做法:

 1 //状态方程:dp[j]=max(dp[j-1]+a[j],a[j]);
 2 //dp[0]=a[0];
 3 #include <iostream>
 4 using namespace std;
 5 int dp[100001];
 6 int a[100001];
 7 int re_start[100001];
 8 int main()
 9 {
10      int i,t;
11   cin>>t;
12   for(i=1;i<=t;i++)
13   {
14    int n,j;
15    cin>>n;
16    for(j=0;j<n;j++)
17     cin>>a[j];
18    dp[0]=a[0];
19    re_start[0]=0;
20    for(j=1;j<n;j++)
21    {
22            if(dp[j-1]+a[j]>=a[j])
23      {
24       dp[j]=dp[j-1]+a[j];
25       re_start[j]=re_start[j-1];
26      }
27      else
28      {
29       dp[j]=a[j];
30       re_start[j]=j;
31      }
32    }
33    int d=dp[0];
34    for(j=0;j<n;j++)
35     if(dp[j]>d)
36      d=dp[j];
37     printf("Case %d:\n",i);
38     for(j=0;j<n;j++)
39      if(d==dp[j])
40      {
41       printf("%d %d %d\n",d,re_start[j]+1,j+1);
42       break;
43      }
44      if(i!=t)
45       printf("\n");
46   }
47   return 0;
48 }

时间: 2024-10-11 00:07:55

HDU_1003Max Sum 简单动归的相关文章

bjfu1332 简单动规

挺简单的动态规划题.我用记忆化搜索打的.直接上代码: /* * Author : ben */ #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <ctime> #include <iostream> #include <algorithm> #include <queue> #include &l

lua 1*100(随机乘与递加)

n = 0 function () local n = n + 1 while n < 100 do math.random(100) end end 随机乘以1到100以内的数↑ 全排列,可以产生N!种排列: local N = 100 local array = {} for i = 1 , N do array[i] = i end for i = 1 , N do local j = math.random(N - i + 1) + i - 1; array[i],array[j] =

一定有你需要收藏的网站!

一.找资源利器 西林街://www.xilinjie.com/ 胖次://www.panc.cc/ EV搜索://www.evsou.com/ 找文件://www.zhaofile.com/ 呆木瓜://www.daimugua.com/ 爱挖盘://www.iwapan.com/ 二.外文书籍下载网站 Library Genesis://gen.lib.rus.ec/ Book ZZ://bookzz.org/ Free-Ebooks://www.free-ebooks.net/ Bookbo

资源查找

作者:贾冰壮链接:http://zhuanlan.zhihu.com/p/21922942来源:知乎著作权归作者所有,转载请联系作者获得授权. 一.找资源利器 去转盘 : http://www.quzhuanpan.com/ 西林街:http://www.xilinjie.com/ EV搜索:http://www.evsou.com/ 找文件:http://www.zhaofile.com/ 呆木瓜:http://www.daimugua.com/ 爱挖盘:http://www.iwapan.c

[zoj3813]Alternating Sum 公式化简,线段树

题意:给一个长度不超过100000的原串S(只包含数字0-9),令T为将S重复若干次首尾连接后得到的新串,有两种操作:(1)修改原串S某个位置的值(2)给定L,R,询问T中L<=i<=j<=R的G(i,j)的和,G(i,j)=Ti-Ti+1+Ti+2-Ti+3+...+(-1)j-iTj,L,R小于1e18 思路:从公式看不出用什么方法快速计算,不妨先对公式化简.令f(i)=(j:i->R)ΣG(i,j),则有:f(i)=G(i,i)+G(i,i+1)+...+G(i,R)  (a

1305 Pairwise Sum and Divide

基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题 有这样一段程序,fun会对整数数组A进行求值,其中Floor表示向下取整: fun(A) sum = 0 for i = 1 to A.length for j = i+1 to A.length sum = sum + Floor((A[i]+A[j])/(A[i]*A[j])) return sum 给出数组A,由你来计算fun(A)的结果.例如:A = {1, 4, 1},fun(A) = [5/4] + [

Linux网络性能优化方法简析

Linux网络性能优化方法简析 2010-12-20 10:56 赵军 IBMDW 字号:T | T 性能问题永远是永恒的主题之一,而Linux在网络性能方面的优势则显而易见,这篇文章是对于Linux内核中提升网络性能的一些优化方法的简析,以让我们去后台看看魔术师表演用的盒子,同时也看看内核极客们是怎样灵活的,渐进的去解决这些实际的问题. AD:2014WOT全球软件技术峰会北京站 课程视频发布 对于网络的行为,可以简单划分为 3 条路径:1) 发送路径,2) 转发路径,3) 接收路径,而网络性

九度oj 题目1465:最简真分数

题目描述: 给出n个正整数,任取两个数分别作为分子和分母组成最简真分数,编程求共有几个这样的组合. 输入: 输入有多组,每组包含n(n<=600)和n个不同的整数,整数大于1且小于等于1000. 当n=0时,程序结束,不需要处理这组数据. 输出: 每行输出最简真分数组合的个数. 样例输入: 7 3 5 7 9 11 13 15 3 2 4 5 0 样例输出: 17 2 此题两两选择,若最大公约数为1,则是最简真分数 代码如下 1 #include <cstdio> 2 #include

Oracle 创建表空间,用户,赋值(简装)

一, 1.Oracle 创建表空间,用户,赋值(简装) C:\Documents and Settings\Administrator>sqlplus /nologSQL> conn /as sysdba 2.删除用户drop user username cascade; 3.创建自增表表空间SQL> create tablespace 表空间 datafile 'E:\oracle\product\10.2.0\oradata\表空间.dbf' size 50m autoextend