随笔分类 - 动态规划
摘要:有两种做法:一种是经典二分图最小顶点覆盖,一种是树形DP,我用的后者。第一次学习树形DP…… 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <vector> 5 #include <algorithm> 6 7 using namespace std; 8 9 const int MAXN = 1600;10 11 int N, root;12 int dp[MAXN][2];13 vector<int> tree[MAXN
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29065Descripion《火影忍者》中,在忍者们使用忍术的时候,需要一定的查克拉(可以看成是一种体力值)。在战斗前,大家都希望提高自己的查克拉。鸣人发明了一种忍术,可以在短时间内提高查克拉。在使用忍术前,鸣人需要做一个仪式,这个仪式决定之后每个时刻的一个查克拉值。这些值的使用规则是:如果在某个时刻发动这个忍术,鸣人需要先消耗该时刻的查克拉值;在某个时候结束这个忍术,鸣人能获得该时刻的查克拉值(忍术必须先发动才能结束)。当然,如果某时刻鸣人具有的查克拉值少于该时刻的查克拉值,那么鸣人是
阅读全文
摘要:dp[m][i][j]代表第m组以字母(i +'a') 开头和以字母 ( j + 'a' )结尾的最小块数。kuai[m]中存储了第 m 组最少可以分为多少块,显然最少为所有相同字母放在一起时的块数,即这一组中不同字母的个数。如果前一组的结尾与后一组的开头相同,则dp[m][i][j] = min( dp[m-1][st][ed] + kuai[m] - 1 );若不同,则dp[m][i][j] = min(dp[m - 1][st][ed] + kuai[m] ); 1 #include <cstdio> 2 #include <cstrin
阅读全文
摘要:DescriptionYou are playing the game ‘Whack the Groundhog’ with your little nephew. Considering your terrible performance, you decide to get some help to establish your glory image in front of him. The first is to collect some necessary data. After a few times of practicing, you get to know exactly w
阅读全文
摘要:题目链接:http://poj.org/problem?id=2374DP+线段树View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 #define lson l, m, rt << 1 7 #define rson m + 1, r, rt << 1 | 1 8 9 using namespace std; 10 11 const int MAXN = 100000; 12 c
阅读全文
摘要:题目链接:http://livearchive.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2644PDF:http://livearchive.onlinejudge.org/external/46/4643.pdf之前翻译有误,已修改!题目翻译:Consider a closed world and a set of features that are defined for all the objects in the world. Each
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1428题意:有三辆车负责投递杂志,有N个位置L1,L2……LN,给出车从Li移动到Lj所用的时间D[i][j],求出投递完所有的位置所用的最少时间。开始时三辆车都在L1,投递时只能有一辆车移动,另外两个呆在原地。并且投递完位置Li-1才能投递Li。思路:DP递推公式:D[i][j][k][m]=min(D[i-1][x][k][m],D[i-1][j][x][m],D[i-1][j][k][x])+time[x][i];(1≤x<i)I代表到位置i所用的最少时间
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3471题目:有N个原子,两两相撞会释放出能量,并且第 i 个原子跟第 j 个原子相撞后原子j会消失,给出一个矩阵,P[i][j]代表第 i 个原子跟第 j 个原子相撞释放的能量值,求这些原子相撞所能释放的最大能量值。分析:状态压缩,最多2^10种状态。集合S表示所有原子集合,i 与 j 相撞, 状态转移方程为:dp[ S ^ (1 << j) ] = max( dp[ S ^ (1 << j) ], dp[S]+ map[i][j]);撞
阅读全文
摘要:目前WA中,正在找错…… 1 #include <cstdio> 2 3 const int MAXN = 1000 + 10; 4 const int INF = 2147483645; 5 6 double stack[MAXN]; 7 double height[MAXN]; 8 double reverse[MAXN]; 9 int n;10 11 int Bsearch( int x, int y, double v )12 {13 int m;14 while ( x < y )15 {16 m = ( x + y ) / 2;17 ...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3267题目:给出一个字典和一个字符串,问这个字符串中最少删去几个字符,能使它变成由字典中的单词组成的序列。分析:从字符串的第一个字符开始,在字典中依次寻找与其匹配的单词:dp[i] = min( dp[i], dp[ i - 1] + 1 ); 如果找不到匹配单词dp[i] = min( dp[i], dp[ i - ( len[j] + cnt ) ] + cnt ); 如果第 j 个单词与其匹配dp[i] 代表到字符串第 i 个字母时需要删去多少个字符,len[j]是字典中第 j 个单词的长度,cnt...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=986最长上升子序列…… 1 #include <cstdio> 2 #include <cstring> 3 4 const int MAXN = 40000 + 10; 5 6 int n; 7 int num[MAXN]; 8 int stack[MAXN]; 9 10 int Bsearch( int x, int y, int v )11 {12 int m;13 while ( x < y )14 {15 m =...
阅读全文
摘要:跟UVa 10453 一个类型的题。题目:给定一个字符串,可以进行 添加任意一个字符,删除任意一个字符,替换任意位置的一个字符变为任意另一个字符 这三种操作,求使得该字符串变成回文串最少操作步数。添加一个字符与删除一个字符等效,因此只考虑添加。递推公式:dp[x][y]代表位置x到位置y的字符串变成回文串的最小操作数if ( str[x]==str[y] ) dp[x][y] = dp[x+1][y-1];else dp[x][y] = min(dp[x+1][y], dp[x][y-1], dp[x+1][y-1]) + 1; 1 #include <cstdio> 2 #inc
阅读全文
摘要:一直都不太会做这种字符串的动规题,今天看了一份解题报告,才稍微有点明白。感觉方法跟求最长公共子序列有点像……之前遇到过几个类似的,改天一块整理一下。-------------------------------------------------------------------题目:给定一个字符串,最少添加几个字符,能使它变成一个回文串。递推公式:dp[x][y]代表从第x个字符到y个字符中间最少需要添加几个字符。if ( str[x] == str[y] ) dp[x][y] = dp[x+1][y-1];else dp[x][y] = min( dp[x][y-1], ...
阅读全文