动态规划
joy_go
这个作者很懒,什么都没留下…
展开
-
POJ 1050(To the Max)
/*** 题意:求最大子矩阵 * 思路:将矩阵看作n行柱形图,其实就是将他 * 转换成一维,然后问题就转换成求最大子段和 * 问题了;* */ #include#define max(a,b) a>b?a:b#define MIN -10000000#define SIZE 130int num[SIZE][SIZE],n,dp[SIZE][SIZE];int m原创 2012-09-17 22:21:57 · 336 阅读 · 0 评论 -
Codeforces 208C(Police Station)
题意:给出一个无向图,边权都为1,居民们需要从顶点1走到顶点n,而且只走最短路;然后让你在1~n中选一个顶点放置警察局,如果一个顶点放置了警察局,那么和这个顶点相连的道路都是安全的;求让你选择一个顶点放置警察局,使所有最短路中含有安全道路的平均值最大;其实就是sum(每一条最短路中含有安全边的数量)/ 最短路数;不同最短路的意思是如果两条路径至少含有1条不同的边就是不相同,不懂就去看题目样例吧-原创 2013-09-03 23:17:55 · 1084 阅读 · 0 评论 -
HDU 4576(Robot)
题意:杭州邀请赛的一道题;有标记着1~n的环,初始时有个机器人在1的位置,有m个操作,每个操作是使机器人随机的顺时针或逆时针的走w步,求所有操作过后机器人停在区间[l,r]内的概率;思路:挺明显的概率dp,首先可以很直观的定义出状态dp[i][j],表示第j次操作后停留在第i位置的概率,转移方程是dp[(i + w) % n][j] = dp[i[j-1] * 0.5;dp[i-w][原创 2013-08-10 18:17:46 · 1284 阅读 · 1 评论 -
HDU 3008(Warcraft)
题意:有点繁琐,这里不叙述了;思路:题目变量有点多,但是有些是不变的,所以定义状态的时候可以把这些忽略掉,然后很明显可以定义状态了,定义完状态之后发现其实是一个01背包,然后照着01背包的思路写就对了;定义状态dp[magic_value][attack_times],左边下标对应攻击完第k次后,右边下标对应的值为剩下的魔法值,数组的值为boss剩下的血量。状态转移方程dp[mag原创 2013-02-20 16:55:51 · 1261 阅读 · 3 评论 -
Codeforces 148E(Porcelain)
题意:娇生惯养的公主总爱发脾气,她每一次发脾气都会摔坏一个价值val的瓷器,这些瓷器放在n个架子上,每个架子有ai个花瓶,她每次只摔架子最左或最右的瓶子,求这摔坏m个瓷器总和的最大价值;题目抽象:有N行数,每行有ai个数,每次只能从每行数的头尾取数,取后将其删除,然后就会产生新的头尾;求从这N行数中取M个数能取得的最大值;思路:观察下题目,先从一行入手,可以发现每一行取出来的数一定是连原创 2013-04-07 20:57:47 · 911 阅读 · 0 评论 -
HDU 1565(方格取数)
第一道状态压缩dp,比较简单,做得也比较暴力,不过还挺适合入门,。。贴个代码纪念一下#include #include #include #include #include #define pub push_back#define LL __int64using namespace std;const int N = 25;const int M = 18000;int原创 2013-04-08 21:55:17 · 713 阅读 · 0 评论 -
Codeforces 225C (Barcode)
题意:要求把乱七八糟的图形刷成黑白相间的图形,且每列的颜色必须一样,然后连续的黑或连续的白的列数大于x且小于y。本题的n没什么用。预处理出列刷成白需要几步,刷成黑需要几步(题意转自ZeroClock)。思路:很明显的DP,感觉也不算很难吧。。但是就是宽度限制会觉得有点繁琐,这题想了挺久的,想到的状态转移方程和题解的有点类似,但还是差了一点,而且我写的状态转移方程条件约束少了,所原创 2013-01-23 14:46:47 · 956 阅读 · 1 评论 -
HDU 1520(Anniversary party)
入门的树形dp,定义dp[i][1/0],1为取当前结点的权值,0为不取状态转移方程:dp[to][1] += max(0, dp[it][0]);dp[to][0] += max(dp[it][0], dp[it][1]);其中to为当前子树父结点,it为to的子结点第一道树形dp,纪念一下#include #include #include using原创 2013-03-02 20:52:29 · 471 阅读 · 0 评论 -
HDU 3651(A Simple Problem)
题意:给出一个1234567890的键盘,你只能用两个手指去摁它,一只在左边一只在右边,而且左手指不能在右手指的右边。然后给出一串数字,求用最少的操作次数来打完这串数字(更多细节看题目);思路:挺有意思的一道dp,想是挺容易想到的,就是状态转移的时候有点繁琐,状态有点多,还有细节要把握得好,注意这些了,AC应该没问题了;定义dp[i][left][right]为打完第i个字符左右手指分别在原创 2013-02-18 21:15:34 · 744 阅读 · 0 评论 -
HDU 2084(数塔)
/**好久没有写博客了,期末琐事比较多,寒假继续刷题看书,现在还在搞DP,我比较喜欢搜索,所以今天打算写个记忆化搜索的题,但是还没写出来,所以用另一道简单的题来熟悉一下记忆化搜索,其实和暴力搜索没太大区别,主要是对结果进行了储存;下面是HDU 2084的代码**/#include#include#includeint num[105][105], dp[105][105], n原创 2013-01-21 19:06:02 · 504 阅读 · 0 评论 -
POJ 2533(Longest Ordered Subsequence)
/**题意:最长上升子序列 *思路:最最最基础的DP, *状态转移方程:dp[i]=max{1,dp[j]+1} j=1,2,...,i-1并且 num[j]<num[i]*测试数据: * 7* 1 7 3 5 9 4 8 *运行完后的dp[i]={1,2,2,3,4,3,4}(下标从1开始) * */#include#define SIZE 1010void init原创 2012-09-12 22:51:17 · 341 阅读 · 0 评论 -
Codeforces 264B (Good Sequences)
题目:http://codeforces.com/problemset/problem/264/B题意:给你一串递增序列,找出最长的一段子序列,满足两两相邻的两个数不互质,并求出最长的子序列长度;思路:官方题解上说是个DP,但我觉得我的做法好像不是DP。。就hash了一下每个数的因子;比赛的时候,算错了复杂度,直接套了个O(n^2)求最长上升子序列的上去,还过了样例,不过最后被原创 2013-01-23 17:17:08 · 929 阅读 · 0 评论 -
HDU 2084(数塔)
好久没有写博客了,期末琐事比较多,寒假继续刷题看书,现在还在搞DP,我比较喜欢搜索,所以今天打算写个记忆化搜索的题,但是还没写出来,所以用另一道简单的题来熟悉一下记忆化搜索,其实和暴力搜索没太大区别,主要是对结果进行了储存;下面是HDU 2084的代码#include#include#includeint num[105][105], dp[105][105], n;原创 2013-01-20 20:54:01 · 80 阅读 · 0 评论 -
POJ 3670 (Eating Together)
题意:给你串序列num[i],1思路:又是DP,做这么多DP题以来发现,做DP题先要划分子问题,这非常的重要,这题的子问题可以划分为dp[i][j]代表第i位改成j的最小值 ,其中1dp[i][j]=min{dp[i-1][k]}+(a[i]!=j) (1这题其实可以只对他求最长不上升或不下降就行了,只需将数组颠倒过来就行了。感想:估计这是做这么多DP题以来,A得最快的一原创 2013-01-25 22:44:08 · 672 阅读 · 0 评论 -
Codeforces 243C
题意:给你一串数字,求用最少的变换次数将数字序列分成两部分,前半部分为负数,后半部分为整数;思路:算是个简单的DP吧,开一个数组dp,dp[i]表示以第i个元素为分界点所需变换的次数,还要开一个数组存第i个元素后面有多少个负数。#include#includeusing namespace std;const int ARRSIZE=100100;const in原创 2013-01-02 23:42:07 · 550 阅读 · 0 评论 -
CodeForces 245H
题意:给出一串字符串,然后m个询问,每个询问是一个区间,求区间内有多少个回文子串;思路:挺不错DP题,这道题需要DP两部分,判断回文和求区间内的回文数;做的时候,只推出了求区间回文数那个状态转移方程,判断回文那个没想到也是DP,用的是朴素的判断回文方法超时了好多次。。。能推出一个觉得还不错,看别人的代码也看懂了判断回文的DP,希望能跟得住节奏吧!列个状态转移方程原创 2013-01-02 01:11:18 · 603 阅读 · 0 评论 -
HDU 2751(命运)
/** 题意:给出一个带权值的矩阵,从左上角走* 到右下角,问怎样走才能使总权值最大; * 行走的要求 :如果当前格子是(x,y),* 下一步可以是(x+1,y),(x,y+1)或者(x,y*k) 其中k>1。 * * 思路:DP,状态转移方程:* sum[i][j]=max{sum[i-1][j],sum[i][k]}+v[i][j];* 其中1<=k<=j-1,且k是j的因子原创 2012-09-13 13:06:30 · 418 阅读 · 0 评论 -
POJ 2247(Humble Numbers)
题意:如果一个数他的质数因子中只含有2,3,5,7其中的一个 或多个,就称为丑数,求n以内的丑数; 思路:看了别人博客,他定义的丑数是2,3,5作为质因子,加了个7做法也一样;假设数组ugly[N]中存放不断产生的丑数,初始只有一个丑数ugly[0]=1,由此出发,下一个丑数由因子2,3,5竞争产生,得到ugly[0]*2, ugly[0]*3,ugly[0]*5, 显然最小的那个数是原创 2012-09-13 15:08:25 · 966 阅读 · 0 评论 -
SGU 149(Computer Network)
题意:求树中任意两点的最长距离;思路:树形dp,这个也是入门题,不过稍难一些,因为状态转移时需要从父亲或儿子中转移,YY了很久也没什么思路,主要是不知道怎么从父亲中状态转移,看了下别人的分析。。原来需要用到两次dfs,还要维护儿子中最长距离和次最长距离(用set,或vector然后排序),涨姿势了。。千辛万苦总算A了。。推荐一篇比较好的分析,认真看下就懂了(http://hi.baidu.co原创 2013-03-07 15:42:28 · 1422 阅读 · 0 评论