poj 1976 A Mini Locomotive(二维dp)
2013-02-16 13:43
399 查看
题意:有N节装有一定人数的车厢,现在想用3个可以来M节车厢的火车头,求3个火车头最多可以带走多少人
思路:1、先预处理出每M节车厢的总人数,出入val数组中
2、f[0][i]=maxm[0]+val[i];
f[1][i]=maxm[1]+val[i];
maxm[0]=MAX(val[i-m+1],maxm[0]);
maxm[1]=MAX(f[0][i-m+1],maxm[1]);
思路:1、先预处理出每M节车厢的总人数,出入val数组中
2、f[0][i]=maxm[0]+val[i];
f[1][i]=maxm[1]+val[i];
maxm[0]=MAX(val[i-m+1],maxm[0]);
maxm[1]=MAX(f[0][i-m+1],maxm[1]);
#include <iostream> #include <string> #include <cstring> #include <cstdio> #include <algorithm> #include <cmath> using namespace std; #define MAX(a,b) (a>b?a:b) const int M(51000); int a[M],val[M],f[2][M]; void dp(int n,int m) { int i,maxm[3]; //memset(f,0,sizeof(f)); maxm[0]=val[0]; maxm[1]=0; for(i=m;i<n;i++) { f[0][i]=maxm[0]+val[i]; f[1][i]=maxm[1]+val[i]; maxm[0]=MAX(val[i-m+1],maxm[0]); maxm[1]=MAX(f[0][i-m+1],maxm[1]); //f[i]=val[i]+maxm; //maxm=MAX(f[i-m+1],maxm); } maxm[0]=0; for(i=0;i<n;i++) maxm[0]=MAX(f[1][i],maxm[0]); printf("%d\n",maxm[0]); } int main() { int t,i,j,k,n,m,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i=0;i<n;i++) scanf("%d",&a[i]); scanf("%d",&m); sum=0; for(i=0,j=0;i<n;i++) { sum+=a[i]; if(i>=m-1) { val[j++]=sum; sum-=a[i-m+1]; } } dp(j,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 最大连续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(0/1背包)
- POJ 1976 A Mini Locomotive (动态规划)
- poj 1976 A Mini Locomotive(01背包)
- poj 1976 A Mini Locomotive 01背包
- A Mini Locomotive POJ - 1976
- poj 1976 A Mini Locomotive(01背包)
- poj 1976 A Mini Locomotive(01背包)
- POJ 1976 A Mini Locomotive(背包)
- poj 1976 A Mini Locomotive 有依赖的背包问题
- M - A Mini Locomotive POJ - 1976