【DP】2479解题报告
2010-05-17 17:10
302 查看
考查点:动态规划
思路:题目的意思实质是要从一个包含n个整数的集合中选取两个不相交的子集,在选取的所有方案中,找出两个子集和的最大值。为此,可以对输入数组进行两个方向的扫描。在正向扫描时,进行一次0(n)的dp,用dp1[i]表示前i个数中连续和的最大值,反相扫描类似。最后从k=0到k=n-2进行遍历,找出max(dp1[k]+dp2[k+1])。
提交情况:一开始是AC,但是由于使用new,内存使用太多,改掉了new,WA。原因是K的取值范围问题。
收获:使用new虽然内存使用更精确,但是由于存在多组测试数据,反而会使得内存使用率大幅上升,一定程度上影响时间。学习了如何在有负数的数组中,求最大连续和。
参考方案:http://fghtech.blogbus.com/logs/62555535.html
Code:
#include <iostream>
using namespace std;
int a[50001],dp1[50001],dp2[50001];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
int n;
scanf("%d",&n);
int sum=0,maxsum=-INT_MAX;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(sum>maxsum)
{
maxsum=sum;
}
dp1[i]=maxsum;
if(sum<0)
sum=0;
}
sum=0;
maxsum=-INT_MAX;
for(int i=n-1;i>=0;i--)
{
sum+=a[i];
if(sum>maxsum)
{
maxsum=sum;
}
dp2[i]=maxsum;
if(sum<0)
sum=0;
}
int result=-INT_MAX;
for(int i=0;i<n-1;i++)
{
if(dp1[i]+dp2[i+1]>result)
result=dp1[i]+dp2[i+1];
}
cout<<result<<endl;
}
return 0;
}
思路:题目的意思实质是要从一个包含n个整数的集合中选取两个不相交的子集,在选取的所有方案中,找出两个子集和的最大值。为此,可以对输入数组进行两个方向的扫描。在正向扫描时,进行一次0(n)的dp,用dp1[i]表示前i个数中连续和的最大值,反相扫描类似。最后从k=0到k=n-2进行遍历,找出max(dp1[k]+dp2[k+1])。
提交情况:一开始是AC,但是由于使用new,内存使用太多,改掉了new,WA。原因是K的取值范围问题。
收获:使用new虽然内存使用更精确,但是由于存在多组测试数据,反而会使得内存使用率大幅上升,一定程度上影响时间。学习了如何在有负数的数组中,求最大连续和。
参考方案:http://fghtech.blogbus.com/logs/62555535.html
Code:
#include <iostream>
using namespace std;
int a[50001],dp1[50001],dp2[50001];
int main()
{
int test;
scanf("%d",&test);
while(test--)
{
int n;
scanf("%d",&n);
int sum=0,maxsum=-INT_MAX;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
if(sum>maxsum)
{
maxsum=sum;
}
dp1[i]=maxsum;
if(sum<0)
sum=0;
}
sum=0;
maxsum=-INT_MAX;
for(int i=n-1;i>=0;i--)
{
sum+=a[i];
if(sum>maxsum)
{
maxsum=sum;
}
dp2[i]=maxsum;
if(sum<0)
sum=0;
}
int result=-INT_MAX;
for(int i=0;i<n-1;i++)
{
if(dp1[i]+dp2[i+1]>result)
result=dp1[i]+dp2[i+1];
}
cout<<result<<endl;
}
return 0;
}
相关文章推荐
- hdu 1913 computer 部分贪心+一维dp 解题报告
- pku 1947 Rebuilding Roads 树形dp 解题报告
- pku 1185 炮兵阵地 压缩dp 解题报告
- 2009 ACM/ICPC 武汉赛区G题解题报告(状态压缩 dp )
- [dp]POJ 3176 Cow Bowling解题报告
- Codeforces Round #396 (Div. 2) C题Mahmoud and a Message(dp)解题报告
- 7.18 DP考试解题报告
- BZOJ 4720 [Noip 2016] 期望DP+最短路 解题报告
- 洛谷 2285 打鼹鼠 递推? DP? 解题报告
- LuoguP1941[NOIP2014] 飞扬的小鸟 解题报告【背包型DP】
- HDU 4582 DFS spanning tree 解题报告(贪心 & 树形DP)
- [dp问题] Poj 1014 & Zoj 1149 (Dividing) 解题报告(转)
- HDU - 1028 Ignatius and the Princess III解题报告(线性dp)
- BZOJ3594[Scoi2014] 方伯伯的玉米田 解题报告【二维树状数组优化DP】
- Codeforces 459E 图上DP 解题报告
- lightoj-1422 - Halloween Costumes 解题报告 区间dp
- LuoguP2679[NOIP2015] 子串 解题报告【多维DP】
- BZOJ 3193 [JLOI 2013] 计数DP 解题报告
- BZOJ 3107 [cqoi 2013] DP 解题报告
- pku_2054 dp Color a tree dp 解题报告