POJ 1976 A Mini Locomotive【DP】
2015-02-24 13:21
281 查看
题意:给出一列火车,可以由三个火车头拉,每个火车头最多拉m节车厢(这m节车厢需要保持连续),再给出n节车厢,每节车厢的人数,问最多能够载多少人到终点。
可以转化为三个长度相等的区间去覆盖n个数,使得这些数的和最大。
用dp[i][j]表示前i个数用j个区间覆盖所得到的最大值,状态转移则为覆盖第i个数,或者不覆盖第i个数。
View Code
参看的这一篇-http://www.cnblogs.com/tmeteorj/archive/2012/09/13/2683926.html
话说读题的时候不认识passenger coaches(车厢)这个单词,以为是站台(可以有人上有人下),然后还在想为什么都没有说相应的乘客要到哪个站台下车----= =不知道想到哪儿去了---5555
又-一次看题解---话说这样想不出来就看题解真的好么@_@
go--go--
可以转化为三个长度相等的区间去覆盖n个数,使得这些数的和最大。
用dp[i][j]表示前i个数用j个区间覆盖所得到的最大值,状态转移则为覆盖第i个数,或者不覆盖第i个数。
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int dp[50005][5],sum[50005]; int main() { int ncase,n,i,j,ans,m; scanf("%d",&ncase); while(ncase--) { memset(dp,0,sizeof(dp)); memset(sum,0,sizeof(sum)); scanf("%d",&n); for(i=1;i<=n;i++) { scanf("%d",&ans); sum[i]=sum[i-1]+ans; } scanf("%d",&m); for(i=1;i<=n;i++) { for(j=1;j<=3;j++) { if(i<=m*j) dp[i][j]=sum[i];//i小于可以覆盖得数字的总数,全部覆盖 else dp[i][j]=max(dp[i-1][j],dp[i-m][j-1]+sum[i]-sum[i-m]); } } printf("%d\n",dp [3]); } return 0; }
View Code
参看的这一篇-http://www.cnblogs.com/tmeteorj/archive/2012/09/13/2683926.html
话说读题的时候不认识passenger coaches(车厢)这个单词,以为是站台(可以有人上有人下),然后还在想为什么都没有说相应的乘客要到哪个站台下车----= =不知道想到哪儿去了---5555
又-一次看题解---话说这样想不出来就看题解真的好么@_@
go--go--
相关文章推荐
- POJ 1976 A Mini Locomotive (DP 最大连续m子段和)
- POJ 1976 A Mini Locomotive (DP 最大连续m子段和)
- POJ_1976 A Mini Locomotive (dp)
- POJ 1976 A Mini Locomotive DP
- poj 1976 A Mini Locomotive_简单dp
- poj-1976 A Mini Locomotive(DP,记忆化搜索)
- poj 1976 A Mini Locomotive (DP)
- POJ - 1976 A Mini Locomotive(背包DP)
- POJ 1976 A Mini Locomotive DP
- poj 1976 A Mini Locomotive(二维dp)
- poj 1976 A Mini Locomotive(01背包)
- poj 1976 A Mini Locomotive(01背包)
- A Mini Locomotive POJ - 1976
- poj 1976 A Mini Locomotive 动规
- POJ 1976 A Mini Locomotive (动态规划)
- poj 1976 A Mini Locomotive 01背包
- poj 1976 A Mini Locomotive 有依赖的背包问题
- M - A Mini Locomotive POJ - 1976
- poj 1976 A Mini Locomotive(0/1背包)
- POJ 1976 A Mini Locomotive(背包)