记忆化搜索
team79
我在努力。
展开
-
poj 1170 记忆化搜索
#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fstruct BP{ int cnt; int num[6]; int price;};int hash[1000];BP bp[100];int B, S;int number[6], pr原创 2014-02-22 16:20:21 · 785 阅读 · 0 评论 -
poj 1946 Cow Cycling DP
dp【n】【e】【d】 表示还有n头奶牛,能量为e,跑d圈所需的最短时间这里只说一下 n > 1的情况dp【n】【e】【d】 = min( dp【n-1】【e-p】【d-p】 +dp【1】【e】【p】 )为什么是这样呢?因为n头奶牛跑d圈,相当于1头奶牛跑了p圈,剩余n-1头跑了d-p圈(注意一点,不管领头的怎么跑,只要跑了p圈,后面的一定是消耗p点能量,所以时间每次与最前面的一头原创 2014-04-01 17:01:04 · 631 阅读 · 0 评论 -
poj 1088 DP
dp[i][j]表示(i,j)所能下滑的最长距离DFS一下即可AC代码如下:#include #include #include #include using namespace std;int dp[110][110];int R, C;int num[110][110];int moves[][2] = { { 0, 1 }, { 0, -1 }, { 1, 0原创 2014-03-20 13:10:36 · 586 阅读 · 0 评论 -
poj 1080 DP
dp【i】【j】表示s1前i个与s2前j个匹配获得的最大值那么可以 i与j匹配 或者 i与‘-’匹配 或者jyu‘-’匹配AC代码如下:#include #include #include #include using namespace std;#define MAX 0x3f3f3f3fchar s1[200], s2[200];int length1, le原创 2014-03-19 22:12:53 · 625 阅读 · 0 评论 -
Lightoj 1084 记忆化搜索(DP)
DFS(cur) 表示从cur开始最少能分多少组然后next是 使cur到next最大 然后if( next - cur >= 3 ){ ans = min( ans, 1 + DFS( next ) ); } if( next - cur >= 4 ){ ans = min( ans, 1 + DFS( next - 1 ) ); } if( next - cur原创 2013-11-07 22:31:12 · 946 阅读 · 0 评论 -
lightoj 1173 记忆化搜索
题目的意思是有N个升高不同的人,求高矮间隔排列的数目,并且依据题目的意思,队长肯定在第一个。然后这一题可以这样想a1 a2 a3 a4 a5.....ak 表示已经排列好了的人,然后还有n个人那么用 dp[n][m][1]来表示 排剩下的n个人,并且这n个人中有m个人比ak高,且接下来排的第一个人要比ak高的 排列数 用 dp[n][m][0]来表示原创 2014-01-07 21:44:30 · 910 阅读 · 0 评论 -
poj 1179 记忆化搜索
注意一点:在加法的时候最大值肯定是两个最大值相加,最小值肯定是两个最小值相加在乘法的时候 最大值可能是两个最大值相乘 也可能是两个最小值相乘,最小值可能是两个最小值相乘,也可能是一个最大值和一个最小值然后我用的是记忆化搜索:dp_min[i][j]表示区间i到j的最小值, dp_max[i][j]表示区间i到j的最大值AC代码如下:#include #include #in原创 2014-02-13 13:31:26 · 743 阅读 · 0 评论 -
poj 1088 DFS+记忆化搜索
开始用的BFS。。。超时。。。。AC代码如下:#include #include #include #include #include using namespace std;struct Node{ int x, y; int h; bool operator<( const Node &b )const{ return h < b.h; }};int M原创 2014-01-18 09:17:08 · 685 阅读 · 0 评论 -
Lightoj 1011 记忆化搜索
AC代码如下:#include #include #include #include #include using namespace std;int dp[17][1<<16];int number[17][17];int N;int dfs( int statu, int n ){ if( n == 0 ){ return 0; } if( dp[n][st原创 2013-10-16 12:50:39 · 761 阅读 · 0 评论 -
Lightoj 1036 DP(记忆化搜索)
记忆化搜索。。。。。。AC代码如下:#include #include #include #include using namespace std;int N, M;int dp[510][510];int u[510][510];int r[510][510];int DFS( int i, int j ){ if( dp[i][j] != 0 ){ retu原创 2013-10-19 10:01:35 · 748 阅读 · 0 评论 -
Lightoj 1071 记忆化搜索
题目的意思是说:在一个二维的方格中有一些人需要帮助,你需要从左上角走到右下角,然后再返回左上角,而且每次走的不能重复,向下的时候只能向下或向右走,返回的时候只能向上或向左走,求最多能救的人数。 这一题简化一下就是要找两条从左上到右下的路,且两条路不能相交。可以用记忆化搜索。 用dp[step][r1][r2]表示各经过step后一条路到达了第r1行,另一个到了r原创 2013-12-28 13:11:44 · 770 阅读 · 0 评论 -
hdu 1142 记忆化搜索
首先用迪杰斯特拉算法求出各点到2的最短距离,然后用记忆化搜索算出 各点到2的可能路径数dp[i]AC代码如下:#include #include #include #include using namespace std;#define MAX 0x3f3f3f3ftypedef struct{ int to, next, weight;}Edge;Edge edg原创 2014-01-02 19:38:44 · 664 阅读 · 0 评论 -
poj 1664 记忆化搜索
AC代码如下:#include #include #include #include using namespace std;int dp[11][11][11];int record[100];int DFS( int m, int n, int pre ){ if( m == 0 && n == 0 ){ // for( int i = 3; i >= 1; i--原创 2014-02-17 09:15:58 · 669 阅读 · 0 评论 -
poj 1187 DP
dp[deep][l1][l2][l3] 表示小于等于deep由 l1, l2, l3 组成的串的个数最后答案是 dp[deep][l1][l2][l3] - dp[deep-1][l1][l2][l3] 显然应当使用递推。对于串的递推,常将其分割为两个或多个较短的子串求解。如果将括号串S分割为两个完全独立的子串L,R,则有N(S)=N(L)*N(R),N(S)表示与串S满足相同的原创 2014-03-23 10:59:01 · 780 阅读 · 0 评论