动态规划 筷子(STICK)
来源:互联网 发布:淘宝客推广平台有哪些 编辑:程序博客网 时间:2024/04/29 09:42
动态规划 筷子(STICK)
题目描述
中国人吃饭必须要用筷子。C先生与常人不同,他的一副筷子有3只,一对再加上一根比较长的,用来穿比较大的食物。两只较短的筷子的长度应该尽可能接近,但是最长的那根的长度是无所谓的。如果一副筷子的长度分别是A,B,C(A<=B<=C),则用(A-B)2的值表示这副筷子的质量,显然这个值越小,质量越高。
C先生邀请了K个朋友去吃饭,而且他要为每个人准备一副这种特殊的筷子。C先生的家里有8个人,因此你总共必须准备K+8副筷子。不过C先生发现他的筷子有各种各样不同的长度,他必须找到一种办法搭配好K+8副筷子,使得这些筷子的质量值之和最小。
输入
第一行有一个整数T,表示文件中共有T组测试数据。T的值不超过20。每一组测试数据的第一行是两个整数K和N,(0<=K<=1000, 3K+24<=N<=5000)。K是邀请朋友的人数,N是C先生家里储备的筷子总根数。接下来的一行有N个正整数,表示这N根筷子的长度;这N个数是从小到大给出的,并且每一根筷子的长度值不超过32000。
输出
单独一行,表示最小的质量值之和。
样例输入
11 401 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
样例输出
23
提示
提示:对于这个例子,一种可行的方案是:
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
话说这都是dp基础题
为啥我现在才写。。。不就是推了一年吗。。。
这个讲真很水的 然而我竟然秒不掉
首先可以证明选相邻的两个计入答案一定是最优的,具体不讲了。。。
然后我们发现直接上dp比较困难,因为选了A,B后还有C要搞
所以。。。倒过来就好了。。。
这样就可以保证用两个较小的项更新答案时一定有更大的在后面
具体的转移方程。。看代码
#include<cmath>#include<ctime>#include<cstdio>#include<cstdlib>#include<cstring>#include<iostream>#include<algorithm>#include<iomanip>#include<vector>#include<string>#include<bitset>#include<queue>#include<set>#include<map>using namespace std;typedef long long ll;inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch<='9'&&ch>='0'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}void print(ll x){if(x<0)putchar('-'),x=-x;if(x>=10)print(x/10);putchar(x%10+'0');}const int N=5010,M=1010;ll f[N][M];int a[N];int main(){int T=read();register int i,j;while(T--){memset(f,0X3f,sizeof(f));int K=read()+8,n=read();for(i=n;i;i--)a[i]=read();f[0][0]=0;for(i=1;i<=n;++i){f[i][0]=0;for(j=1;j<=i/3&&j<=K;++j)f[i][j]=min(f[i-1][j],f[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]));}print(f[n][K]);puts("");}return 0;}/*11 401 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 16423*/
阅读全文
0 0
- 动态规划 筷子(STICK)
- 3031:筷子(stick) 动态规划
- 动态规划之 <筷子>
- 1200. Stick 匹配相同长度筷子
- 1200.Stick(统计筷子配对,用map来做)
- 筷子
- 筷子
- 筷子
- 筷子
- 筷子
- 筷子
- Stick
- Stick
- Stick
- stick
- stick
- stick
- stick
- phplib template基础教程核心教程案例
- 第四章 决策树
- Codeforces-Strange Game On Matrix(暴力直接写)
- 杂记小结
- LeetCode----- 12.Integer to Roman
- 动态规划 筷子(STICK)
- poj 2954 Triangle
- 二分图的最小顶点覆盖 和 最大独立集 和 最大团
- 668[Hard]:Kth Smallest Number in Multiplication Table
- maven jar包重复载入问题解决
- centos7安装nginx
- Android6.0杀死进程方法
- POJ2692 Kindergarten 最大团 + 补图二分图
- UOJ149【NOIP2015】子串 (DP)