uva 10271 Chopsticks(dp)
题目大意:给出m和n, 然后给出n根筷子从小到大给出, 现在要从这n根筷子中选出m + 8组筷子, 每组筷子包括三根, 现在要求所有m + 8组每组筷子中最短两根筷子之差的平方 的和最小,输出最小值。
解题思路:一开始想用贪心做, 后来发现子问题是互相干预的。
dp[i][j]表示在在第i根筷子已经取了j组筷子后的和的最小值, 因为给出的筷子已经从小到大排列, 所以每根筷子的最小组合肯定是和前后的筷子,这样遍历的时候其实可以不用想太多,直接每个和后面一个配对考虑就好了。然后对于第i根筷子是取还是不取除了和最小的条件之外还有要求取了i和i + 1这两根筷子之后, 还能保证前面确定的j对筷子都能满足再添加一根较长的(题目要求三根)。
#include <stdio.h>
#include <string.h>
const int N = 5010;
const int MAX = 0x3f3f3f3f;
int min(int a, int b) { return a > b ? b : a; } int val[N], dp[N][1010]; int P(int a) {
return a * a;
} int main () {
int cas, n, m;
scanf("%d", &cas);
while (cas--) {
scanf("%d%d", &m, &n);
memset(dp, MAX, sizeof(dp)); m += 8;
dp[0][0] = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &val[i]);
dp[i][0] = 0;
} for (int i = n - 2; i >= 1; i--) {
for (int j = m; j >= 1; j--) {
dp[i][j] = dp[i + 1][j];
if (dp[i + 2][j - 1] != MAX && n - i - j * 3 >= -1)
dp[i][j] = min(dp[i][j], dp[i + 2][j - 1] + P(val[i] - val[i + 1]));
}
}
printf("%d\n", dp[1][m]);
}
return 0;
}
uva 10271 Chopsticks(dp)的更多相关文章
- UVA.10192 Vacation (DP LCS)
UVA.10192 Vacation (DP LCS) 题意分析 某人要指定旅游路线,父母分别给出了一系列城市的旅游顺序,求满足父母建议的最大的城市数量是多少. 对于父母的建议分别作为2个子串,对其做 ...
- UVA.10130 SuperSale (DP 01背包)
UVA.10130 SuperSale (DP 01背包) 题意分析 现在有一家人去超市购物.每个人都有所能携带的重量上限.超市中的每个商品有其相应的价值和重量,并且有规定,每人每种商品最多购买一个. ...
- uva 10271 (dp)
题意:有n个数据,给定k,要从中选出k+8个三元组(x,y,z,其中x<=y<=z),每选一次的代价为(x-y)^2,求最小代价和. [解题方法] 将筷子按长度从大到小排序 排序原因: 由 ...
- BZOJ 1260&UVa 4394 区间DP
题意: 给一段字符串成段染色,问染成目标串最少次数. SOL: 区间DP... DP[i][j]表示从i染到j最小代价 转移:dp[i][j]=min(dp[i][j],dp[i+1][k]+dp[k ...
- UVa 10029 hash + dp
题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...
- uva 10154 贪心+dp
题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem ...
- UVA 1358 - Generator(dp+高斯消元+KMP)
UVA 1358 - Generator option=com_onlinejudge&Itemid=8&page=show_problem&category=524& ...
- uva 1534 - Taekwondo(dp+馋)
题目连接:uva 1534 - Taekwondo 题目大意:有两组什么东西,题目背景有点忘记了,就是给出两组数,两组个数分别为n,m,要求找出min(n,m)对数.每一个数最多最多选一次,使得这mi ...
- uva 10118(DP)
UVA 10118 题意: 有4堆糖果,每堆有n(最多40)个,有一个篮子,最多装5个糖果,我们每次只能从某一堆糖果里拿出一个糖果, 如果篮子里有两个相同的糖果,那么就可以把这两个(一对)糖果放进自己 ...
随机推荐
- 在systemd(CentOS7)自启动zookeeper
zookeeper的自启动脚本,如果是 sysV 模式(CeontOS6或以下版本),可以直接使用下载版本中的 src 目录下对应的 sysV 自启动包,再chkconfig即可.老方法,简单,就不说 ...
- TCP/IP笔记 三.运输层(3)——TCP超时重传算法
TCP 每发送一个报文段,就对这个报文段设置一次计时器.只要计时器设置的重传时间到但还没有收到确认,就要重传这一报文段 1. 平均往返时延RTT 往返时延:一个报文段发出的时间,以及收到相应的确认报文 ...
- perl5 附录一 函数集(未定稿)
附录一 函数集(未定稿) by flamephoenix 一.进程处理函数 1.进程启动函数 2.进程终止函数 3.进程控制函数 4.其它控制函数二.数学函数三.字符串处理函数四.标量转换函数 ...
- BZOJ 1062
program candy bzoj1062; ; maxm=; maxn=; var n,len,m,i,p,t,l,r,c,d,q:longint; s:..,..maxn,..maxm] of ...
- Android 中文API (65) —— BluetoothClass[蓝牙]
前言 本章内容是android.bluetooth.BluetoothClass,为Android蓝牙部分的章节翻译.用于描述远端设备的类型,特点等信息,通过getBluetoothClass()方法 ...
- 「OC」构造方法和分类
一.构造方法 (一)构造方法的调用 创建一个可用的对象:Person *p=[Person new]; new方法实际上是分为两步来创建一个对象: 1)使用+alloc方法来分配存储空间(返回分配的对 ...
- myEclipse快捷键及其常用设置
快捷键: 查找替换:ctrl + f 复制行: ctrl + alt + down 删除行: ctrl + d 插入行: shift + enter, ctrl + shift ...
- Android——用户登陆及用户名和密码的保存
Android——用户登陆及用户名和密码的保存 在之前的学习过程中已经将Android学习完了,但是在后面将近一年的时间里都没有进行过Android开发,所以对Android的所有的知识点又有点忘 ...
- php随笔7-thinkphp OA系统 JS 文本框输入实时控制字数
JS: //多行文本输入框剩余字数计算 function checkMaxInput(obj, maxLen) { if (obj == null || obj == undefined || obj ...
- Nginx阅读笔记(二)之location的用法
两个配置文件 一: server { listen 80; # # 在本机所有ip上监听80,也可以写为192.168.1.202:80,这样的话,就只监听192.168.1.202上的80口 ser ...