POJ-2479(DP)

一个线性DP的经典入门题,不难,但是看到有的大神写出来的时间只有两位数的时间,最快的16MS,真是想破脑袋也做不到。

 1 /*Memory:704K Time:422MS */
 2
 3 #include<cstdio>
 4 #include<algorithm>
 5 using namespace std;
 6 int a[50001],left[50001],right[50001];
 7 void maxsum()
 8 {
 9     int t,n,i,res;
10     scanf("%d",&t);
11         while(t--)
12         {
13             scanf("%d",&n);
14             for(i=0;i<n;i++)
15             {
16                 scanf("%d",&a[i]);
17             }
18             left[0]=a[0];
19             right[n-1]=a[n-1];
20             for(i=1;i<n;i++)
21             {
22                 if(left[i-1]<0)left[i]=a[i];
23                 else left[i]=left[i-1]+a[i];
24                 if(right[n-i]<0)right[n-i-1]=a[n-i-1];
25                 else right[n-i-1]=right[n-i]+a[n-i-1];
26             }
27             for(i=1;i<n;i++)
28             {
29                 left[i]=max(left[i],left[i-1]);
30                 right[n-i-1]=max(right[n-i],right[n-i-1]);
31             }
32             res=-1000000;
33             for(i=1;i<n;i++)
34             {
35                 res=max(res,left[i-1]+right[i]);
36             }
37             printf("%d\n",res);
38         }
39 }
40 int main()
41 {
42     maxsum();
43     return 0;
44 }
时间: 2024-11-06 07:29:00

POJ-2479(DP)的相关文章

poj 2479 dp求分段最大和

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 38079   Accepted: 11904 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

[ACM] POJ 2479 Maximum sum (动态规划求不相交的两段子段和的最大值)

Maximum sum Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 33363   Accepted: 10330 Description Given a set of n integers: A={a1, a2,..., an}, we define a function d(A) as below: Your task is to calculate d(A). Input The input consists o

HDU 1087 &amp;&amp; POJ 2533(DP,最长上升子序列).

~~~~ 两道题的意思差不多,HDU上是求最长上升子序列的和,而POJ上就的是其长度. 貌似还有用二分写的nlogn的算法,不过这俩题n^2就可以过嘛.. ~~~~ 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1087 http://poj.org/problem?id=2533 ~~~~ HDU1087: #include<cstdio> #include<cstring> #include<algorithm> #

POJ 3670 &amp;&amp; POJ 3671 (dp)

最长不下降子序列的应用嘛.两题都是一样的. POJ 3670:求给定序列按递增或递减排列时,所需改变的最小的数字的数目. POJ 3671:求给定序列按递增排列时,所需改变的最小的数字的数目. 思路就是求最长不下降子序列,然后剩下的就是需要改变的字母. 最长不下降子序列:(我之前有写过,不懂请戳)http://blog.csdn.net/darwin_/article/details/38360997 POJ 3670: #include<cstdio> #include<cstring

poj 3783 DP 2个鸡蛋扔100层楼的加强版

http://poj.org/problem?id=3783 估计23号之后的排位赛之后我就要退役了,这之前最后再做5天ACM 今天的排位很惨,上次排位也很惨......这道题原来算法课老师讲过,模模糊糊记得方程,但是边界处理有问题, dp[i][j]=min(1+max(dp[k-1][j-1],dp[i-k][j]))   k=1 to 楼数 dp[i][j]:i层楼扔,手里有j个ball 的次数 边界两个:1.dp[1][i]=1,第一层无论手里有几个鸡蛋都是1次,2.dp[i][1]=i

POJ 3034 DP

打地鼠游戏中,你有一个锤子,每一秒钟你可以拿着锤子移动d个单位的距离,必须是直线,掠过的鼠洞中露出的地鼠都会被锤打至,而事先知道从开始时各时间段内出现在老鼠的数量和位置,问题是从游戏开始至结束时,你最多能打到多少只地鼠,开始时锤子可以在任何位置. 题目有个陷阱, 只是说Moles出现的坐标为正,但没说hammer移动的位置要为正,可以为"any position" 所以锤子可以移出矩阵,再从矩阵外一点移进来 例: 20 5 4 1 0 1 0 1 1 0 5 2 1 6 2 0 0 0

POJ 4968 DP||记忆化搜索

给出N个人的平局分X 根据GPA规则计算可能的最高平均GPA和最低平均GPA 可以DP预处理出来所有结果  或者记忆化搜索 DP: #include "stdio.h" #include "string.h" int inf=100000000; double a[11][1100],b[11][1100]; double Max(double a,double b) { if (a<b) return b; else return a; } double M

POJ 2029 DP || 暴力

在大矩形中找一个小矩形 使小矩形包含的*最多 暴力或者DP  水题 暴力: #include "stdio.h" #include "string.h" int main() { int n,m,w,i,s,t,j,k,l,ans,sum,x,y; int map[101][101]; while (scanf("%d",&w)!=EOF) { if(w==0) break; scanf("%d%d",&n,&

POJ 1160 DP

用数轴描述一条高速公路,有V个村庄,每一个村庄坐落在数轴的某个点上,需要选择P个村庄在其中建立邮局,要求每个村庄到最近邮局的距离和最小. cost记录每两个村庄之间建一个邮局的最小代价. 转移方程: dp[j][i]=Min(dp[j][i],dp[k][i-1]+cost[k+1][j]) 前j个村庄建i个邮局=前k个村庄建I-1个邮局+第k+1村庄到第j村庄建一个邮局的代价 #include "stdio.h" #include "string.h" int i

POJ 4939 DP

给你一段长为n的路,每一个单位长度可以放一种塔,这里有三种塔. 红1)对正在经过这座塔的敌人进行 x 每秒伤害的攻击 绿2)对于已经经过这塔的敌人进行y每秒的伤害攻击 蓝3)对已经经过这个塔的敌人放慢速度,使得原先为 经过一个单位时间为  t的速度变为  t+z 对于红塔一定是放在最后面,然后对于前面的绿塔和蓝塔DP dp[i][j]=Max(dp[i-1][j-1]+y*(i-j)*(t+(j-1)*z),dp[i-1][j]+y*(i-j-1)*(t+j*z)); 前i个放j个蓝塔=Max(