!HDU 1500 Chopsticks-dp-(分组问题)

题意:一种新式筷子:每副有三支,两支短的,长度差要尽可能小;一支长的,只要满足是一副里最长的就行。在n支筷子里选k副,要求每副里的短筷子的长度差总和最小

分析:

分组dp模型。这题跟搬寝室那题差不多,但这题的每组里多了一个长筷子,所以排序的时候从大到小,这样才能在一遍dp的时候一遍把长的选进每一组里,具体怎么实现的不要过于钻牛角尖。

正如搬寝室里总结的分组模型的实现方式有两种,这里也给出两个代码。注意具体实现上的一些细节差异,还有初始化。

把两道题结合起来看加深理解。

代码1:

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define min(a,b) a<b?a:b;
#define INF 1000000007
using namespace std;
int t,k,n;
int dp[5010][1100],a[5100];
bool cmp(int i,int j)
{
	return i>j;
}
int main()
{
	cin>>t;
	while(t--){
		cin>>k>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		sort(a+1,a+n+1,cmp);
		k+=8;
		for(int i=0;i<=n;i++)
		  for(int j=1;j<=k;j++)
		     dp[i][j]=INF;
		for(int i=0;i<=n;i++) dp[i][0]=0;
		for(int i=3;i<=n;i++){
			for(int j=1;j*3<=i;j++){
			    dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));
			}
		}
		cout<<dp[n][k]<<endl;
	}
}

代码2:

#include<iostream>
#include<algorithm>
#include<cstring>
#define min(a,b) a<b?a:b;
using namespace std;
int t,k,n;
int dp[1010][5100],a[5100];
bool cmp(int i,int j)
{
	return i>j;
}
int main()
{
	cin>>t;
	while(t--){
		cin>>k>>n;
		for(int i=1;i<=n;i++) cin>>a[i];
		sort(a+1,a+n+1,cmp);
		memset(dp,0,sizeof(dp));
		k+=8;
		for(int i=1;i<=k;i++){
			dp[i][3*i]=dp[i-1][3*i-2]+(a[3*i]-a[3*i-1])*(a[3*i]-a[3*i-1]);
			for(int j=3*i+1;j<=n;j++)
			    dp[i][j]=min(dp[i][j-1],dp[i-1][j-2]+(a[j]-a[j-1])*(a[j]-a[j-1]));
		}
		cout<<dp[k][n]<<endl;
	}
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-07 00:14:17

!HDU 1500 Chopsticks-dp-(分组问题)的相关文章

hdu 1500 Chopsticks DP

题目链接:HDU - 1500 In China, people use a pair of chopsticks to get food on the table, but Mr. L is a bit different. He uses a set of three chopsticks -- one pair, plus an EXTRA long chopstick to get some big food by piercing it through the food. As you

hdu 1500 Chopsticks

http://acm.hdu.edu.cn/showproblem.php?pid=1500 dp[i][j]为第i个人第j个筷子. 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 using namespace std; 5 6 int dp[1011][5011]; 7 int a[5011]; 8 int k,n; 9 int sqr(int x) 10 { 11 return x

hdu 5148 树形dp+分组背包问题

http://acm.hdu.edu.cn/showproblem.php?pid=5148 Problem Description Long long ago,there is a knight called JayYe.He lives in a small country.This country is made up of n cities connected by n-1 roads(that means it's a tree).The king wants to reward Ja

hdu 1561 树形dp+分组背包

题意:就是给定n个点,每个地点有value[i]的宝物,而且有的宝物必须是另一个宝物取了才能取,问取m个点可以获得的最多宝物价值. 一个子节点就可以返回m个状态,每个状态表示容量为j(j<=m)时选最多的宝物,而一个子节点中只可以选择一个状态进行转移,每个节点有若干个子节点,问题就转换为分组背包,几个子节点就是几个分组背包,体积是选几个地点,价值是宝物价值. 状态转移方程: dp[v][1] = Money[v]; (v为叶子节点)                    dp[v][j] = m

hdu 4003 树形dp+分组背包

题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 Sample Output 3 2 转移方程: dp[i][j]=min(dp[i][j],dp[i][j*k],dp[son[i]][k]+len(i,son[i])*k) 方程还是比较好写的,主要是要遍历所有的点 下面我们分析一下第一个样例 1 / \ / \ 2 3 我们派了一个机器人去3,

hdu 4003 树形dp+分组背包 2011大连赛区网络赛C

题意:求K个机器人从同一点出发,遍历所有点所需的最小花费 链接:点我 Sample Input 3 1 1 //3个点,从1出发,1个机器人 1 2 1 1 3 1 3 1 2 1 2 1 1 3 1 Sample Output 3 2 转移方程: dp[i][j]=min(dp[i][j],dp[i][j*k],dp[son[i]][k]+len(i,son[i])*k) 方程还是比较好写的,主要是要遍历所有的点 下面我们分析一下第一个样例 1 / \ / \ 2 3 我们派了一个机器人去3,

hdu4003 树形dp+分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4003 Problem Description Humans have discovered a kind of new metal mineral on Mars which are distributed in point‐like with paths connecting each of them which formed a tree. Now Humans launches k robots on

HDU ACM 4044 GeoDefense -&gt;树形DP+分组背包

题意:地图是一个编号为1-n的节点的树,节点1是敌方基地,其他叶节点是我方基地.敌人基地会出来敌人,为了防止敌人攻进我方基地,我们可以选择造塔.每个节点只能造一个塔,节点i有ki种塔供选择,价值和攻击力为price_i, power_i,攻击力power_i是让敌人经过这个节点时让敌人的HP减少power_i点.因此从敌人基地到我方任意一个基地的路径,这条路径上所有塔的攻击力之和,就是这个基地的抵抗力. 敌人攻击路径不确定,为了保护我方所有基地,需要确定所有基地中抵抗力最低的一个.我方只有数量为

hdu4044 树形dp+分组背包

http://acm.hdu.edu.cn/showproblem.php?pid=4044 Problem Description Tower defense is a kind of real-time strategy computer games. The goal of tower defense games is to try to stop enemies from reaching your bases by building towers which shoot at them

hdu 4734 数位dp

http://acm.hdu.edu.cn/showproblem.php?pid=4734 Problem Description For a decimal number x with n digits (AnAn-1An-2 ... A2A1), we define its weight as F(x) = An * 2n-1 + An-1 * 2n-2 + ... + A2 * 2 + A1 * 1. Now you are given two numbers A and B, plea