[Dynamic Programming]
一刀不二
这个作者很懒,什么都没留下…
展开
-
POJ_1178_Camelot(floyd+枚举)
#include #include #include #include #include using namespace std;#define BOARDSIZE 8#define POWBOARDSIZE 64#define SIZE 10#define INF 0x3f3f3f3f#define MAX 70struct Point{原创 2013-09-30 03:03:08 · 818 阅读 · 0 评论 -
树形动态规划 POJ 3342 Party at Hali-Bula
#include #include #include using namespace std;int Graph[210][210];int DP[210][2];int count;void DFS( int index ){ DP[index][0] = 0; DP[index][1] = 1; for( int i = 1;原创 2013-10-31 06:36:49 · 943 阅读 · 0 评论 -
区间DP——整数划分(使乘积最大)
将N长度的整数切割成M段,使乘积最大。#include #include #include using namespace std;#define SIZE 20char arr[SIZE];int Num[SIZE][SIZE];int DP[SIZE][SIZE];int len;int cutNum;void getNum(){ fo原创 2013-11-09 11:54:39 · 1327 阅读 · 0 评论 -
区间DP -- 石子合并(朴素DP)
设Num[i][j]表示从第i堆到第j堆石子数总和。DPMax[i][j]表示将从第i堆石子合并到第j堆石子的最大的得分DPMax[i][j] = max( DPMax[i][j], DPMax[i][k] + DPMax[k + 1][j] + Num[i][j] ); 时间复杂度:O(n^3)优化:四边形优化,GarsiaWachs #include #includ原创 2013-11-09 22:45:10 · 955 阅读 · 0 评论 -
POJ_3267_The Cow Lexicon ( DP )
#include #include using namespace std;#define LMAX 310#define WMAX 610int DP[LMAX];string str[WMAX];char msg[LMAX];int W, L;void comp( const int& strID, const int& msgPos ){ int strLen =原创 2013-12-03 10:33:55 · 918 阅读 · 0 评论 -
POJ_2353_Ministry(双向动态规划)
//懒得写思路#include #include using namespace std;int fee[101][501],dp[101][501],ans[50000] ; struct point { int x,y ; } way[101][501] ; int main() { int m,n ;原创 2013-10-14 14:24:17 · 994 阅读 · 0 评论 -
POJ_1141_Brackets Sequence
#include #include #include using namespace std;#define SIZE 105char s[SIZE];int len;int DP[SIZE][SIZE];int pos[SIZE][SIZE];void DPAlg(){ for( int i = 0; i < len; ++i ) DP[i]原创 2013-10-14 11:42:14 · 738 阅读 · 0 评论 -
ecnu 1244
顺序可略,多阶段决策,1.当前木块放在第col上面,2.当前木块另起col,3.舍弃#include #include using namespace std;struct Block{ int lens[3];};Block blocks[110];int DP[110][110][110][3];int M, N;int judge( int be原创 2014-10-17 23:03:04 · 975 阅读 · 0 评论 -
棋盘分割 动态规划
将一个8*8的棋盘进行如下分割:将原棋盘割下一块矩形棋盘并使剩下部分也是矩形,再将剩下的部分继续如此分割,这样割了(n-1)次后,连同最后剩下的矩形棋盘共有n块矩形棋盘。(每次切割都只能沿着棋盘格子的边进行) 原棋盘上每一格有一个分值,一块矩形棋盘的总分为其所含各格分值之和。现在需要把棋盘按上述规则分割成n块矩形棋盘,并使各矩形棋盘总分的均方差最小。 均方差,其中平均值,x原创 2014-10-18 11:05:54 · 1949 阅读 · 0 评论 -
ZOJ 3471 状态DP
有 N 种 atom,每种 atom 与不同于自身的 atom 碰撞会产生一定能量,且有一方消失,atom 自身不能和自身碰撞,有一个矩阵表示他们之间碰撞所产生的能量,A[i][j] = x 代表 i 和 j 碰撞,产生 x能量且 j 消失,问能做多产生多少能量?#include #include using namespace std;int arr[11][11];原创 2015-02-01 21:53:25 · 696 阅读 · 0 评论 -
SGU-448 Controlled Tournament ( 状态DP )
输入比赛人员个数 N 和你希望赢的人的编号 M,然后输入 N * N 的输赢表,第 i 行 第 j 列为 1,代表 i 能赢 j。求 M 最后能赢,且总比赛树的高度最小为 h 时,一共有多少种可能。比如输入:7 20 1 0 0 0 1 00 0 1 0 1 1 11 0 0 1 1 0 01 1 0 0 0 1 01 0 0 1 0 0 10 0 1 0原创 2015-01-15 22:03:33 · 1106 阅读 · 0 评论 -
HDU 1074 Doing Homework 状态DP
相同答案,要字典序,注意 tak原创 2014-11-22 23:31:23 · 855 阅读 · 0 评论 -
POJ 3254 Corn Field ( 状态压缩DP )
简单题,边界处理注意。可以优化,就不精益求精了。#include #include #include #include using namespace std;#define MOD 100000000int field[20];int DP[20][1200];int main(){ int N, M; cin >> N >> M; me原创 2014-11-23 14:38:50 · 1181 阅读 · 0 评论 -
CEOI 2002, POJ 1038 Bugs Integrated, Inc. 状态压缩 DP
有点点小虐心。#include #include #include using namespace std;const int ternarys[12] = { 0, 1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049 };int DP[2][59049];int bit_map[155][15];int pre_li原创 2014-11-25 17:02:00 · 1177 阅读 · 0 评论 -
POJ 2228 Naptime 环状DP
一个环,分成 N 个区间,每个区间有个权值,你可以选择 B 个区间,这些区间可以连续也可以不连续。那么如何使得选中的区间中的权值之和最大。有个限制条件,任何连续的区间,第一个区间的权值是不算的。比如你选中编号为 k, k + 1, k + 2 的这 3 个区间时,第编号 k 的区间的权值是不算进去的,只能算后两个区间 k + 1 和 k + 2 区间的权值之和(但是你损耗了 3 个区间原创 2015-01-02 15:46:12 · 1014 阅读 · 0 评论 -
POJ_1390_Blocks(DP)
//滚你个毛线球球,因为少减1结果浪费了4个小时的时间检查,懒得解释。#include #include using namespace std;#define SIZE 202int dp[SIZE][SIZE][SIZE];struct Block{ Block():color(0),len(0),after(0){} int color;原创 2013-10-19 10:29:59 · 606 阅读 · 0 评论 -
多线程DP 三取方格数
描述: 设有N*N的方格图,我们将其中的某些方格填入正整数,而其他的方格中放入0。某人从图得左上角出发,可以向下走,也可以向右走,直到到达右下角。在走过的路上,他取走了方格中的数。(取走后方格中数字变为0)此人从左上角到右下角共走3次,试找出3条路径,使得取得的数总和最大。输入格式:第一行:N(4接下来一个N*N的矩阵,矩阵中每个元素不超过80,不小于0原创 2013-11-12 23:52:34 · 1666 阅读 · 0 评论 -
快速幂应用
Google Code Jam -- Number( 2008 Round C )求 ( 3 + 5 ^ 0.5 ) ^ N ( 1 ( 3 + 5 ^ 0.5 ) ^ N 都可以变形为 ( A + B * ( 5 ^ 0.5 ) ) 的结构( 3 + 5 ^ 0.5 ) ^ ( N + 1 ) = ( 3 + 5 ^ 0.5 ) * ( 3原创 2014-10-22 16:36:03 · 893 阅读 · 0 评论 -
01背包 决策树模型 Python
def DecisionTree( weight_arr, value_arr, index, left_space ): if index == 0: if left_space >= weight_arr[index]: return value_arr[index] else: return 0 without_index = DecisionTree( weight原创 2014-01-15 19:16:20 · 1533 阅读 · 0 评论 -
POJ 1179 Polygon
区间DP问题注意最大值原创 2014-05-20 11:00:43 · 922 阅读 · 0 评论 -
POJ 2192 Zipper
大体题意: 先输入试验次数num,再输入三个字符串A,B,C,判断C可否由A,B按照某种次序组成。如下图。#include #include using namespace std;#define MAX_SIZE 205char A[MAX_SIZE];char B[MAX_SIZE];char C[2 * MAX_SIZE];bool原创 2014-05-20 23:48:16 · 1025 阅读 · 0 评论 -
状态压缩动态规划 -- 多米诺骨牌
用1*2 的骨牌通过组合拼成 m * n 的大矩形,问有几种拼法。题目链接:http://poj.org/problem?id=2411状态转移:由于上一行的该列竖直放置骨牌为 0,影响到当前行的该列,当前行的该列为 1当前行骨牌横放,上一行骨牌横放, 都为11上一行该列置为 1,当前行当前列立着放为 0#include #include using原创 2014-06-26 19:50:45 · 1980 阅读 · 0 评论 -
状态压缩动态规划 -- 炮兵阵地
司令部的将军们打算在N*M的网格地图上部署他们的炮兵部队,一个N*M的地图由N行M列组成,地图的每一格可能是山地(用"H" 表示),也可能是平原(用"P"表示),如下图。在每一格平原地形上最多可以布置一支炮兵部队(山地上不能够部署炮兵部队);一支炮兵部队在地图上的攻击范围如图中黑色区域所示:如果在地图中的灰色所标识的平原上部署一支炮兵部队,则图中的黑色的网格表示它能够攻击到的区原创 2014-06-29 15:11:59 · 1198 阅读 · 0 评论 -
动态规划+滚动数组 -- POJ 1159 Palindrome
给一字符串,问最少加几个字符可以让它成为回文串比如 Ab3bd 最少需要两个字符可以成为回文串 dAb3bAd思路:动态规划 DP[i][j] 意味着从 i 到 j 这段字符变为回文串最少要几个字符,枚举子串长。if str[i] == str[j]:DP[i][j] = DP[i + 1][j - 1]else:DP[i][j] = min( DP[i +原创 2014-07-18 18:14:17 · 1319 阅读 · 0 评论 -
POJ 2241 The Tower of Babylon
DP求解。对Blocks的先按照X降级,再按照Y降级排序,可以转化为最长公共子序列问题,即求子序列权值之和最大。#include #include #include using namespace std;#define MAX_SIZE 300struct Block{ int x; int y; int height;};int nums原创 2014-05-29 21:28:21 · 1082 阅读 · 0 评论 -
状态压缩动态规划 -- 旅行商问题
旅行商问题:N个点(N并且路径上边的权值和最小(或者最大),或者求一条具有这样性质的回路。状态压缩:将二进制表示十进制数N的点集,比如:10 = 00001010 代表第1和3个点已经路过18 = 00010010 代表第1和4个点已经路过一个整数就是一个点集,dp_arr[i][j]代表经过点集i中,当前终点为j,且路径最短的值,若该状态不存在就是原创 2014-06-17 03:47:56 · 2382 阅读 · 0 评论 -
状态压缩动态规划 -- 棋盘问题 POJ 1321
DFS太慢,用SCR好点点Python 只有 22 行,其实可以更短,但是得排成很长很长的一行while True: table = [ [ 0 for j in range( 300 ) ] for i in range( 12 ) ] table[0][0] = 1 boardsize, chessnum = map( int, raw_input().spli原创 2014-06-21 19:37:32 · 1587 阅读 · 0 评论 -
POJ 1463 Strategic game( 树形DP )
#include #include using namespace std;#define ABANDON 0#define GET 1deque graph[2010];int DP[2010][2];void DFS( int start, int parent ){ DP[start][ABANDON] = 0; DP[start][GET]原创 2014-09-26 15:36:57 · 935 阅读 · 0 评论 -
HDU 4301 Divide Chocolate ( 动态规划 )
2 * N 的方块被划分为 M 块(每一块都不一样),有多少种不同的分法。#include using namespace std;#define MERGE 1#define CUT 0#define MOD 100000007int DP[1010][2020][2]= {0};int test;int n, m, ans;int main(){原创 2014-09-24 19:22:05 · 992 阅读 · 0 评论 -
简单线性动态规划 —— 编辑距离
if s[i] = t[j] then d[i, j] := d[i-1, j-1] // no operation requiredelse d[i, j] := minimum( d[i-1, j] + 1, // a deletion d[i, j-1] + 1,原创 2014-09-27 20:46:22 · 989 阅读 · 0 评论 -
POJ 2486 Apple Tree ( 树型DP )
#include #include #include using namespace std;#define SIZE 230#define BACK 1#define AWAY 0int DP[SIZE][SIZE][2];bool visits[SIZE];int vals[SIZE];deque tree[SIZE];int num, steps;void原创 2014-10-05 12:49:14 · 1060 阅读 · 0 评论 -
POJ 2342 Anniversary Party ( 树形DP )
deque 的插入操作不一定有 vector 快#include #include #include #include using namespace std;#define NOT_SELECTED 0#define SELECTED 1#define SIZE 6001vector relations[SIZE];bool visited[SIZE];int DP[原创 2015-02-18 21:39:07 · 756 阅读 · 0 评论