POJ2479【DP 枚举】
题意:给出一串数字,求出其中不重不交的两个子串的和的最大值
思路:最近最大子串和做多了,感觉这题有点水。枚举分割点,将序列分成左右两串,然后看左右串的最大子串和的最大值。
//poj2479
#include<cstdio>
#include<string.h>
#include<iostream>
#define inf 19941117
using namespace std;
const int maxn=50009;
int maxf(int a,int b)
{if (a>b)return a;else return b;}
int main()
{
int t,a[maxn],left[maxn]={0},right[maxn]={0},n,l[maxn]={0},r[maxn]={0};
scanf("%d",&t);
while(t--)
{
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
right[n+1]=left[0]=l[0]=r[n+1]=-inf;
for(inti=1;i<=n;i++)l[i]=max(left[i]=maxf(a[i],a[i]+left[i-1]),l[i-1]);
for(inti=n;i>=1;i--)r[i]=max(right[i]=maxf(a[i],a[i]+right[i+1]),r[i+1]);
int max=-inf;
for(int i=1;i<=n-1;i++)
max=maxf(r[i+1]+l[i],max);
printf("%d\n",max);
}
return 0;
}
调试小结:1WA 1 PE
好吧 最大子序和有两种写法,一种是累加得到sum,一旦sum<0就给sum赋0的做法,另一种就是dp的方法:dp[i]=max{dp[i-1]+a[i],a[i]},两种写法本质上是等价的,其中第一种写法是我一直用的,空间复杂度为O(1),只是这题存在全部是负数的情况用第一种写法需要判断下,而正是判断的错误导致了第一次WA所以索性换了第二种写法就A了,那次PE是输出的行末没加空行 \nTUT
- Triangular Pastures-DP(有点像是暴力枚举)
- SCU 4488 king's trouble II(dp||枚举)
- hdu 4354 Missile(中心区间枚举+树形DP判断,5级)
- cf#22-B-Bargaining Table-枚举+贪心+dp(最大连续区间和)
- UVA 11825 Hackers' Crackdown(枚举子集+dp)
- POJ:1050(枚举 + DP)
- uva 1640 两种方法 数位dp或枚举计算
- 【POJ2479】Maximum sum(动态规划,DP)
- poj 3140 Contestants Division(树形dp? dfs计数+枚举)
- 【HDU5928 2016CCPC东北地区大学生程序设计竞赛 - 重现赛 G】【计算几何 凸包思想 枚举底点做DP】Birthday Gift 给定绳长最多围住多少个点
- Fzu 2200 cleaning【环状Dp-----暴力枚举拆环】
- 51nod-1158 . 全是1的最大子矩阵 &&CODEVS-2491 玉蟾宫(枚举+单调栈 or dp)
- SCU 4488 king's trouble II(dp||枚举)
- 2017盛大游戏杯 零件组装(状态压缩DP之巧妙枚举子集)
- LA 4794(dp+枚举子集)分享巧克力
- hdu 4628 Pieces (状态压缩+二进制枚举+dp)
- poj 3036 Honeycomb Walk 暴力枚举 dp
- HDU 4722 Good Numbers 数位dp或找规律枚举 数位dp感悟
- poj1837 Balance 看似dfs但是是枚举(dp)
- HDU--5280(dp或枚举)