codevs 1962 马棚问题--序列型DP
1962 马棚问题
每天,小明和他的马外出,然后他们一边跑一边玩耍。当他们结束的时候,必须带所有的马返回马棚,小明有K个马棚。他把他的马排成一排然后跟随它走向马棚,因为他们非常疲劳,小明不想让他的马做过多的移动。因此他想了一个办法:将马按照顺序放在马棚中,后面的马放的马棚的序号不会大于前面的马放的马棚的序号。而且,他不想他的K个马棚中任何一个空置,也不想任何一匹马在外面。已知共有黑、白两种马,而且它们相处得并不十分融洽。如果有i个白马和j个黑马在一个马棚中,那么这个马棚的不愉快系数将是i*j。所有k个马棚不愉快系数的和就是系数总和。确定一种方法把n匹马放入k个马棚,使得系数总和最小
输入:在第一行有两个数字:n(1≤n≤500)和k(1≤k≤n)。在接下来的n行是n个数。在这些行中的第i行代表队列中的第i匹马的颜色:1意味着马是黑色的,0意味着马是白色的。
输出:只输出一个单一的数字,代表系数总和可能达到的最小值
6 3
1
1
0
1
0
1
2
/*典型的序列性DP,f[i][j]记录前i匹马,分到j个马棚里的最小不愉快系数,p[i][j]储存着i到j这个区间的马在一个马棚里的不愉快系数,house[i]储存着到地i匹马总共有多少匹白马,多少匹黑马*/
#include<cstdio>
#include<iostream>
#include<cstdlib>
#include<cstring>
using namespace std;
#define N 501
int f[N][N],p[N][N];
struct House{
int a;int b;
};
House house[N];
int n,k;
void input()
{
scanf("%d%d",&n,&k);
int x;
for(int i=;i<=n;++i)
{
scanf("%d",&x);
house[i].a=house[i-].a;
house[i].b=house[i-].b;
if(x==) house[i].a++;
if(x==) house[i].b++;
}
for(int i=;i<=n-;++i)/*对于p数组的预处理特别重要*/
for(int j=i+;j<=n;++j)
{
int r1=abs(house[i-].a-house[j].a);
int r2=abs(house[i-].b-house[j].b);
p[i][j]=r1*r2;
}
memset(f,,sizeof(f));
for(int i=;i<=n;++i)
f[i][]=p[][i];/*DP方程的边界,前i个马在一个马棚的不愉快系数*/
}
void dp()
{
for(int j=;j<=k;++j)
for(int i=j;i<=n;++i)
for(int t=j-;t<=i-;++t)
f[i][j]=min(f[i][j],f[t][j-]+p[t+][i]);/*DP方程前i匹马,分到j个马棚里的最小不愉快系数,就是把j-1<=t<=i-1匹马放到j-1个马棚中,其余t+1到i匹马在一个马棚中的不愉快系数最小值*/
}
int main()
{
input();
dp();
cout<<f[n][k]<<endl;
return ;
}
codevs 1962 马棚问题--序列型DP的更多相关文章
- 1134 最长上升子序列 (序列型 DP)
思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序 ...
- leetcode动态规划笔记三---单序列型
单序列型DP 相比一维DP,这种类型状态转移与过去每个阶段的状态都有关. Longest Increasing Subsequence : 求最大最小值 Perfect Squares : 求某个规模 ...
- 区间型DP
区间型DP是一类经典的动态规划问题,主要特征是可以先将大区间拆分成小区间求解最后由小区间的解得到大区间的解. 有三道例题 一.石子合并 在一个圆形操场的四周摆放N堆石子,现要将石子有次序地合并成一堆. ...
- 「bzoj1925」「Sdoi2010」地精部落 (计数型dp)
「bzoj1925」「Sdoi2010」地精部落---------------------------------------------------------------------------- ...
- Codeforces 149D Coloring Brackets(树型DP)
题目链接 Coloring Brackets 考虑树型DP.(我参考了Q巨的代码还是略不理解……) 首先在序列的最外面加一对括号.预处理出DFS树. 每个点有9中状态.假设0位不涂色,1为涂红色,2为 ...
- POJ3659 Cell Phone Network(树上最小支配集:树型DP)
题目求一棵树的最小支配数. 支配集,即把图的点分成两个集合,所有非支配集内的点都和支配集内的某一点相邻. 听说即使是二分图,最小支配集的求解也是还没多项式算法的.而树上求最小支配集树型DP就OK了. ...
- POJ_1088 滑雪(记忆型DP+DFS)
Description Michael喜欢滑雪,这并不奇怪, 因为滑雪的确很刺激.可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你.Michael想知道 ...
- UVA12186--树型DP
树型DP第一题...就是从boss到底层员工是一个树型结构,底层员工想加薪,如果每个boss都有超过T%的员工要求加薪,他就会往更高的bOSs传达,问如果让根节点的大boss接到加薪要求,最少要有多少 ...
- POJ 3342 - Party at Hali-Bula 树型DP+最优解唯一性判断
好久没写树型dp了...以前都是先找到叶子节点.用队列维护来做的...这次学着vector动态数组+DFS回朔的方法..感觉思路更加的清晰... 关于题目的第一问...能邀请到的最多人数..so ea ...
随机推荐
- notifier chain — 内核通知链【转】
转自:http://blog.csdn.net/g_salamander/article/details/8081724 大多数内核子系统都是相互独立的,因此某个子系统可能对其它子系统产生的事件感兴趣 ...
- Laravel artisan commands
使用php artisan list 可以看到artisan的所有命令以及选项. 当然你也可以在此基础上扩展自己的命令. 1. key 1.1 key:generate 这是一个加密秘钥,用于保证安全 ...
- 微信openid和UnionID (多公众号如何判断是否是同一人)
以下内容源于网络,因为非博客园信息,有想收藏,只能直接复制粘贴了,还希望原稿人员理解. 微信公众平台更新,为开发者提供UnionID机制 经开发者反馈,由于同一公司下多个公众号之间需要用户帐号互通,微 ...
- python和语法糖
语法糖(syntactic sugar)是指编程语言中可以更容易的表达一个操作的语法,它可以使程序员更加容易去使用这门语言:操作可以变得更加清晰.方便,或者更加符合程序员的编程习惯.(百度百科的 ...
- 深度学习开源工具——caffe介绍
本页是转载caffe的一个介绍,之前的页面图都down了,更新一下. 目录 简介 要点记录 提问 总结 简介 报告时间是北京时间 12月14日 凌晨一点到两点,主讲人是 Caffe 团队的核心之一 E ...
- Palindrome Partitioning——回溯算法的又一经典
Given a string s, partition s such that every substring of the partition is a palindrome. Return all ...
- (ubuntu) pip install scandir 时出现错误 fatal error: Python.h: No such file or directory
安装 jupyter时遇到这个问题,在这里查到了解决方法,特记录一下. 解决方式为: 先安装 python-dev: $ sudo apt-get install python-dev 然后再安装需要 ...
- spring 以及 spring mvc 中常用注解整理
spring 以及 spring mvc 中常用注解整理 @RequestMapping(映射路径) @Autowired(注入 bean 对象) 例如: @Autowired private Bas ...
- VS2013 打开项目时提示This project is incompatible with the current edition Visual Studio.
刚安装完成了Visual Studio 2013后,打开项目时,遇到以下问题 解决方法:在Visual Studio 2013 的菜单中打开“Tools",并打开“Extensions an ...
- 51nod 1295 XOR key-区间异或最大值-可持久化01Trie树(模板)
1295 XOR key 2 秒 262,144 KB 160 分 6 级题 给出一个长度为N的正整数数组A,再给出Q个查询,每个查询包括3个数,L, R, X (L <= R).求A[L] ...