Codeforces 148E Porcelain [预处理+dp背包]

给出n行数,每行的数目不定(不超过100个),只能从行的两端取数m次,求所取数的和最大值 n (1?≤?n?≤?100) andm (1?≤?m?≤?10000).

看似很难上手

我甚至想每次取一个,然后搜索,,,搜索分支有200个

如果我们知道每行取k个最多能取多少的话

那么

这个问题就变成了

如果我在前i-1行取了j次得到x的破坏值

那么我要再第i行取k次得到get[k]的破坏值

也就是前i行共取了k+j次得到了x+get[k]的破坏值

背包问题

暴力求解出每行取k个最大的破坏值即可(一个滑动的遮挡块,在第n行上滑,长度为n-k)

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const int NN=111;
int maxn[NN][NN*100];
int sum[NN][NN*100];
int f[NN][NN*100];
int dp[NN][NN*100];
int main(){
#ifndef ONLINE_JUDGE
	freopen("/home/rainto96/in.txt","r",stdin);
#endif

	int n,m;
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		int k;cin>>k;
		for(int j=1;j<=k;j++){
			cin>>f[i][j];
			sum[i][j]=f[i][j]+sum[i][j-1];//前缀和,以便求得每行取l次能取的最大和
		}
		for(int j=0;j<=k;j++){
			for(int l=0;l<=j;l++)
			maxn[i][j]=max(maxn[i][j],sum[i][l]+sum[i][k]-sum[i][k-j+l]);//求得每行取l次能取的最大和
		}
		for(int j=m;j>=0;j--){
			for(int l=0;l<=k && l<=j;l++)
			dp[i][j]=max(dp[i][j],dp[i-1][j-l]+maxn[i][l]);//背包滚动
		}
	}
	cout<<dp[n][m]<<endl;
}
时间: 2024-11-07 23:45:27

Codeforces 148E Porcelain [预处理+dp背包]的相关文章

Codeforces 148E Porcelain (预处理+多重背包)

E. Porcelain time limit per test:3 seconds memory limit per test:256 megabytes During her tantrums the princess usually smashes some collectable porcelain. Every furious shriek is accompanied with one item smashed. The collection of porcelain is arra

Codeforces 148E. Porcelain【多重背包】

题目大意: 有一个公主一生气就喜欢摔东西.现在有很多个柜子,每个柜子里面装着很多物品,公主每次摔东西只能随机的选择一个柜子,拿出最左边或者最右边的一个物品摔碎,给出公主最多生气的次数,求生完气之后,公主摔掉物品的价值的最大总和. 做法: 对于每个柜子来说,从左边拿和从右边拿是不一样的,假设最佳方案中,在第i个柜子中需要拿Ki个物品,那么拿着Ki个物品的最大价值我们是可以确定的.一:全从左边拿,二:全从右边拿,三,左边那一部分,右边拿一部分.最后,我们可以算出w[i][k](在第i个柜子中拿k个物

codeforces 148E Aragorn&#39;s Story 背包DP

Aragorn's Story Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/problemset/problem/148/E Description Our protagonist is the handsome human prince Aragorn comes from The Lord of the Rings. One day Aragorn finds a lot of enemies who

CodeForces 148E Porcelain dp+背包(水

题目链接:点击打开链接 题意: 给定一个n层书架,一共取m本书. 下面n行给出每层书的价值. 每次可以取任意一层的最左端或最右端的一本书. 问能获得的最大价值. 思路: 1.显然是先求出对于每层任取任意本书能获得的最大价值. 2.然后背包一下. 1: 对于一层书任意j本,那么一定是从左端取k本,右端取 j-k本,求个前缀和然后枚举 j和k即可.每层n^2的dp 2: 分组背包. import java.io.BufferedReader; import java.io.InputStreamRe

codeforces 148E Porcelain

E. Porcelain During her tantrums the princess usually smashes some collectable porcelain. Every furious shriek is accompanied with one item smashed. The collection of porcelain is arranged neatly on n shelves. Within each shelf the items are placed i

CodeForces 283C Coin Troubles 分析+背包思想

很灵活的题目,题意简单,看到又是钱币问题,类似于那种给了一定数目T,有n种钱币,每种的价值,让你组合成总价值为T的方案数,但是加了一些限制条件,那就是某些种类钱币数量必须大于另一些种类的,加了个限制条件 我就脑残了,唉智商看来是真不够啊 ,后来看了别人的分析 倘若种类a的钱币数量必须要大于种类b的数量,那么如果我要 去 m张b种类的钱币,其实同时也是相当于已经取了m张a种类的,因为a必须大于b的嘛,所以我们可以通过这样来修改题目给的钱币的价值,若a种类数量必须大于b种类数量,且a种类价值为A,b

codeforces 148D 【概率dp】

题目链接: codeforces 148D Bag of mice 题意:一个包里面有w只白老鼠和b只黑老鼠,公主与龙依次从包中拿老鼠,每次取一只,当龙拿时还会从包中溜走一只,先拿到老鼠的获胜,当背包中没老鼠时且之前没人拿到白老鼠则龙获胜,问公主获胜的概率是多少. 题解: 设dp[i][j]为背包中有i只白老鼠j只黑老鼠时公主获胜的概率 则公主获胜的情况分成三种: 1.直接拿到白老鼠 p1=i/(i+j) 2.公主拿到黑老鼠,龙拿到黑老鼠,逃跑一只黑老鼠 p2=(j/(i+j)) ((j-1)/

HDU 1011 Starship Troopers(树形dp+背包)

Starship Troopers Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 13109    Accepted Submission(s): 3562 Problem Description You, the leader of Starship Troopers, are sent to destroy a base of

POJ 3132 Sum of Different Primes DP背包

http://poj.org/problem?id=3132 题意: 给定n和k,问用恰好k个不同的质数来表示n的方案数. 分析: n和k都很小.反正就是个背包,选k个物品恰好填满n即可. 1 #include<cstdio> 2 #include<cstring> 3 using namespace std; 4 5 bool dp[1200][15]; 6 int ct[1200][15]; 7 int p[1200]; 8 bool a[1200]; 9 int n, k,