HDU 3127 WHUgirls dp背包问题
WHUgirlsTime Limit: 3000/2000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)
Problem Description
There are many pretty girls in Wuhan University, and as we know, every girl loves pretty clothes,
so do they. One day some of them got a huge rectangular cloth and they want to cut it into small
rectangular pieces to make scarves. But different girls like different style, and they voted each
style a price wrote down on a list. They have a machine which can cut one cloth into exactly
two smaller rectangular pieces horizontally or vertically, and ask you to use this machine
to cut the original huge cloth into pieces appeared in the list. Girls wish to get the highest
profit from the small pieces after cutting, so you need to find out a best cutting strategy.
You are free to make as many scarves of a given style as you wish, or none if desired.
Of course, the girls do not require you to use all the cloth.
Input
The first line of input consists of an integer T, indicating the number of test cases.
The first line of each case consists of three integers N, X, Y, N indicating there are
N kinds of rectangular that you can cut in and made to scarves; X, Yindicating the
dimension of the original cloth. The next N lines, each line consists of two integers,
xi, yi, ci, indicating the dimension and the price of the ith rectangular piece cloth
you can cut in.
Output
Output the maximum sum of prices that you can get on a single line for each case.
Constrains
Sample Input
1
2 4 4 2 2 2 3 3 9
Sample Output
9
Source
Recommend
lcy
|
题解:
这是一道模仿现实的题目。它给的是长跟宽,你要知道。。现实中长跟宽是可以互换的。当然,你也可以这样再优化一下,可能存在长跟宽相同,价值不同的,保留最大的就好了。
注意。。题目中的切开是一切到底。不是任意切!!这样列出的DP方程是不一样的
刚开始我的DP方程是
i,j表示长为i,宽为j的空间
f[i][j]=max(f[i][j],f[i][j-k]+f[i][k],f[i-k][j]+f[k][j]) + 一点点优化。。 f[i][j]初始状态就是所给的一系列长跟宽跟价值.
f[p[k].x][p[k].y]=p[k].c
。。不过这样水不过去。
后来改写成2维的背包。593MS过掉。
dp[i][j]=max(dp[i-p[k].x][j]+p[k].c+dp[p[k].x][j-p[k].y],dp[i][j],dp[i-p[k].x][p[k].y]+dp[i][j-p[k].y]+p[k].c);
要推出这条式子,你拿出一块草稿画一下就好了。 先中间切下去,然后在右边那小块再横着来一下。就是了。。
/*
* @author ipqhjjybj
* @date 20130724
*
*/ #include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime> #include <iostream>
#include <cmath>
#include <algorithm>
#include <numeric>
#include <utility> #include <cstring>
#include <vector>
#include <stack>
#include <queue>
#include <map>
#include <string>
using namespace std; #define inf 0x3f3f3f3f
#define MAXN 1005
#define clr(x,k) memset((x),(k),sizeof(x))
#define clrn(x,k) memset((x),(k),(n+1)*sizeof(int))
#define cpy(x,k) memcpy((x),(k),sizeof(x))
#define Base 10000 typedef vector<int> vi;
typedef stack<int> si;
typedef vector<string> vs;
#define sz(a) int((a).size())
#define pb push_back
#define all(c) (c).begin(),(c).end()
#define rep(i,n) for(int i = 0;i < n;++i)
#define foreach(it,c) for(vi::iterator it = (c).begin();it != (c).end();++it) #define min(a,b) ((a)<(b)?(a):(b))
struct node{
int x,y,c;
}p[MAXN];
int dp[MAXN][MAXN];
int X,Y,n;
int max(int a,int b){
return a>b?a:b;
}
int main(){
//freopen("3127.in","r",stdin);
int T;
scanf("%d",&T);
while(T--){
clr(dp,0);
scanf("%d %d %d",&n,&X,&Y);
for(int i=0,a,b,c;i<n;i++){
scanf("%d %d %d",&a,&b,&c);
p[i<<1].x=a,p[i<<1].y=b,p[i<<1].c=c;
p[i<<1|1].x=b,p[i<<1|1].y=a,p[i<<1|1].c=c;
}
n <<=1;
for(int i=0;i<=X;i++)
for(int j=0;j<=Y;j++){
for(int k=0;k<n;k++){
if(i>=p[k].x&&j>=p[k].y){
dp[i][j]=max(max(dp[i-p[k].x][j]+p[k].c+dp[p[k].x][j-p[k].y],dp[i][j]),
dp[i-p[k].x][p[k].y]+dp[i][j-p[k].y]+p[k].c);
//printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
}
}
dp[i][j]=max(dp[i][j],dp[i-1][j]);
dp[i][j]=max(dp[i][j],dp[i][j-1]);
}
printf("%d\n",dp[X][Y]);
}
return 0;
}
HDU 3127 WHUgirls dp背包问题的更多相关文章
- HDU 3127 WHUgirls(完全背包)
HDU 3127 WHUgirls(完全背包) http://acm.hdu.edu.cn/showproblem.php? pid=3127 题意: 如今有一块X*Y的矩形布条, 然后有n种规格的x ...
- HDU 3127 WHUgirls(DP 完全背包)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3127 题目大意:将一块长x宽y的矩形布料,剪成小的矩形(每个给定的小矩形都对应一个价值),使得所有小矩 ...
- HDU 3127 WHUgirls【二维完全背包】
题意:给出一个长为a,宽为b的布,再给出n个围巾的规格(长x,宽y,价值c),问怎样裁剪能够得到最大的价值. ----第一次做的时候不会---然后放到今天做--发现还是不会---于是又--看题解了-- ...
- HDU 1561 树形DP背包问题
这是自己第一道背包上树形结构问题,不是很理解这个概念的可以先看看背包九讲 自己第一次做,看了一下别人的思路,结合着对简单背包问题的求解方式自己一次AC了还是有点小激动的 题目大意是: 攻克m个城市,每 ...
- HDU 3127 WHUgirls
二维完全背包,理解似乎还不够全面,过几天回来再看看这题. #include<cstdio> #include<cstring> #include<cmath> #i ...
- hdu 4123 树形DP+RMQ
http://acm.hdu.edu.cn/showproblem.php? pid=4123 Problem Description Bob wants to hold a race to enco ...
- hdu 4507 数位dp(求和,求平方和)
http://acm.hdu.edu.cn/showproblem.php?pid=4507 Problem Description 单身! 依旧单身! 吉哥依旧单身! DS级码农吉哥依旧单身! 所以 ...
- hdu 3709 数字dp(小思)
http://acm.hdu.edu.cn/showproblem.php?pid=3709 Problem Description A balanced number is a non-negati ...
- hdu 4352 数位dp + 状态压缩
XHXJ's LIS Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- Java实现缓存(类似于Redis)
Java实现缓存,类似于Redis的实现,可以缓存对象到内存中,提高访问效率.代码如下: import java.util.ArrayList; import java.util.HashMap; i ...
- C# winform调用WebBrowser经典怪问题总结
原文:C# winform调用WebBrowser经典怪问题总结 最近一直研究网页数据采集,单单采集数据,其实HtmlAgilityPack就足够了. 对HtmlAgilityPack感兴趣的可以到这 ...
- Android在真机调试的设置方法
1. 设置android手机为USB调试模式.步骤: menu---> 设置 ---> 应用程序 ---> 开发 , 选择[USB调试] 2. 用USB连接手机和电脑,并确保成功.步 ...
- NM常用网络命令
Ipconfig命令 Ipconfig命令可以被用来显示机器当前TCP/IP配置信息. 当使用Ipconfig时不带不论什么參数选项,那么它为每一个已经配置好的接口显示IP地址.子网掩码和默认网关值. ...
- 定制openwrt的根文件
都在package文件夹之中 1 ssh登陆欢迎文字,在package/base-files/files/etc/banner中 2 路由器的默认机器名字,在package/base-files/fi ...
- FineUI开发实践
ASP.NET-FineUI开发实践-7 摘要: 下拉显示grid列表.其实很简单,但是试了很多方法,水平有限,主要是都不好使,还是简单的好使了,分享下.先是看了看网上的,是直接写个了extjs控件类 ...
- Grunt使用入门
Grunt使用入门 (by vczero) 一.前言 项目中一直在使用Grunt,只是对Grunt的基本使用,却未系统的总结过.为什么要构建工具?一句话:自动化.对于需要反复重复的任务,例如压缩(mi ...
- Web服务器性能/压力测试工具http_load、webbench、ab、Siege使用教程
一.http_load 程序非常小,解压后也不到100K http_load以并行复用的方式运行,用以测试web服务器的吞吐量与负载.但是它不同于大多数压力测试工 具,它可以以一个单一的进程运行,一般 ...
- ODBC操作excel
//ODBC连接Excel public static void main(String[] args) { Connection conn = null; Statement stm = nul ...
- form-validation--表单验证插件
基于jquery的validationEngine表单验证插件,根据官网提示,该插件支持IE6-8,Chrome浏览器,火狐,Safari,Opera 10,但由于有使用到了css3的阴影和圆角样式, ...