我是靠谱客的博主 追寻钥匙,最近开发中收集的这篇文章主要介绍HDU-OJ-1500 Chopsticks Chopsticks,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Chopsticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)


Problem Description
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 may guess, the length of the two shorter chopsticks should be as close as possible, but the length of the extra one is not important, as long as it's the longest. To make things clearer, for the set of chopsticks with lengths A,B,C(A<=B<=C), (A-B)^2 is called the 'badness' of the set. 
It's December 2nd, Mr.L's birthday! He invited K people to join his birthday party, and would like to introduce his way of using chopsticks. So, he should prepare K+8 sets of chopsticks(for himself, his wife, his little son, little daughter, his mother, father, mother-in-law, father-in-law, and K other guests). But Mr.L suddenly discovered that his chopsticks are of quite different lengths! He should find a way of composing the K+8 sets, so that the total badness of all the sets is minimized.
 

Input
The first line in the input contains a single integer T, indicating the number of test cases(1<=T<=20). Each test case begins with two integers K, N(0<=K<=1000, 3K+24<=N<=5000), the number of guests and the number of chopsticks. There are N positive integers Li on the next line in non-decreasing order indicating the lengths of the chopsticks.(1<=Li<=32000).
 

Output
For each test case in the input, print a line containing the minimal total badness of all the sets.
 

Sample Input
1 1 40 1 8 10 16 19 22 27 33 36 40 47 52 56 61 63 71 72 75 81 81 84 88 96 98 103 110 113 118 124 128 129 134 134 139 148 157 157 160 162 164
 

Sample Output
23 Note For the sample input, a possible collection of the 9 sets is: 8,10,16; 19,22,27; 61,63,75; 71,72,88; 81,81,84; 96,98,103; 128,129,148; 134,134,139; 157,157,160
 

Source
OIBH Reminiscence Programming Contest
 

Recommend
xhd
 

————————————————————加油的分割线————————————————————

思路:有点吃力……虽然这道题和HDU的搬寝室很像,但是在无后效性上有细节的不同。
参见博客:搬寝室
先是分类:分组DP。每组三个数。
然后状态:前 i 组,第 j 个筷子。dp[ i ][ j ]值表示前 i 组短的两根筷子差值平方的和。
无后效:这要认真思考。怎么处理最长筷呢?我们分析一下:首先,每一组的dp[ ][ ]值只跟短的俩筷子有关,与最长筷是无关的。其次,每组的第三筷一定要足够长,比前两根都长才行。问题迎刃而解。并不需要考虑哪根筷子是第三筷,我只需要保证:1.一定有第三根 2.第三根足够长。那么直接就可以向搬寝室靠近。
我只需要让筷子从大到小排序,然后从第一个人开始,保证他有三根筷子可拿并且只有拿最后两根才可能是最优解。没错,规划第 i*3 根及第 i*3-1 根筷子即可。类似,对于第2个人,除去要规划的最后两根,前面有3*2-2 = 4根筷子,这四根中有三根是第一个人的,剩下一个足够大的是第二个人的最长筷。
决策:要么从前 i-1 组转移,要么不取这根筷子,从上一根筷子直接转移。当时取dp值小的。
起始条件、状转方程、初始化和搬寝室一样。
For j: i*3 ~ n
dp[i][j] = min{dp[i][j-1], dp[i-2][j-1] + (A[j-1] - A[j])^2}
代码如下:
/****************************************/
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <stack>
#include <queue>
#include <vector>
#include <map>
#include <string>
#include <iostream>
using namespace std;
/****************************************/
#define S (a[j-1] - a[j])*(a[j-1] - a[j])
const int MAXN = 5010, N = 1010, SUP = 2e9;
int a[MAXN], dp[N][MAXN];
int main()
{
int cas;
scanf("%d", &cas);
while(cas--) {
int chop, guest;
scanf("%d%d", &guest, &chop);
guest += 8;
for(int i = chop; i >= 1; i--)
scanf("%d", &a[i]);//变成递减的,保证存在最长筷
for(int i = 1; i <= guest; i++)
for(int j = 0; j <= chop; j++)
dp[i][j] = SUP;
for(int j = 0; j <= chop; j++)
dp[0][j] = 0;
for(int i = 1; i <= guest; i++)
for(int j = 3*i; j <= chop; j++)
dp[i][j] = min(dp[i][j-1], dp[i-1][j-2] + S);
printf("%dn", dp[guest][chop]);
}
return 0;
}


最后

以上就是追寻钥匙为你收集整理的HDU-OJ-1500 Chopsticks Chopsticks的全部内容,希望文章能够帮你解决HDU-OJ-1500 Chopsticks Chopsticks所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(57)

评论列表共有 0 条评论

立即
投稿
返回
顶部