PKU--1976 A Mini Locomotive (01背包)
2013-12-10 23:56 gongti 阅读(226) 评论(0) 编辑 收藏 举报
题目http://poj.org/problem?id=1976
分析:给n个数,求连续3段和的最大值。
这个题目的思考方式很像背包问题。
dp[i][j]表示前i个数字,放在j段的最大值。
如果选了第i个数,则有 dp[i-1][j] 如果不选第i个数,由于题目是要连续的,
则有dp[i-m][j-1]+sum[i]-sum[i-m] ,这里i-m是要保证连续。
dp[i][j]=max{ dp[i-1][j] ,dp[i-m][j-1]+sum[i]-sum[i-m] }
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int T,n,m,sum[50010],num[50010],dp[50010][5];
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
memset(sum,0,sizeof(sum));
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)
{
scanf("%d",&num[i]);
sum[i]=sum[i-1]+num[i];
}
scanf("%d",&m);
for(int i=m;i<=n;i++)
for(int j=1;j<=3;j++)
dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]);
printf("%d\n",dp[n][3]);
}
return 0;
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步