记忆化搜索 逆向dp uva10118
2016-12-04 11:18
351 查看
记忆化搜索 逆向dp uva10118
这道题开始做的时候很容易 把状态定义成5维 d(i,j,k,h,g) 前面4个变量表示4堆糖果的现在在哪个位置 而后一个g则表示篮子里有几颗糖果 后面想了一下 我用递推的话那么我怎么推出每个状态后面的那个g 就是比较难转移 好像不行 因为之前很少用记忆话搜索 所以没有想到这个原来记忆话搜索有这样的好处!记忆话搜索 是根据当前状态 而推出下一个状态 这样可以利用 传值或者全局变量就可表示每个状态之后的g
g是被动变量 也就是根据前面4个变量变化而变化的 不能定义成状态!卧槽 sb le
题解看代码!
#include <iostream> #include <string.h> using namespace std; int n; int map[45][5],d[45][45][45][45];//d(i,j,k,h)表示4堆的所处的状态 进行递推 从0 0 0 0开始->dp的子问题 每个子问题的最优值 到达 n n n n时解就出来了 int dp(int *top,int st,int k)//st 传值 { int &m=d[top[0]][top[1]][top[2]][top[3]]; if(m!=-1) return m; if( top[0]==n && top[1]==n&& top[2]==n && top[3]==n || k==5) return m=0; for(int i=0;i<4;i++) { if(top[i]<n) { int ne=1<<map[top[i]][i]; top[i]++; if(st&ne) m=max(m,dp(top,st-ne,k-1)+1); else if(k<5) m=max(m,dp(top,st+ne,k+1)); top[i]--; } } return m; } int main() { while(scanf("%d",&n) && n) { for(int i=0;i<n;i++) for(int j=0;j<4;j++) scanf("%d",&map[i][j]); int top[5]={0}; memset(d,-1,sizeof(d)); printf("%d\n",dp(top,0,0)); } return 0; }
相关文章推荐
- [逆向DP]UVa10118 - Free Candies
- Free Candies - UVa 10118 dp
- UVA - 10118 Free Candies 记忆化搜索
- UVa 1252 - Twenty Questions(记忆化搜索,状态压缩dp)
- UVA - 10118 Free Candies(dp 与状态所对应的信息)
- 例题9-10 UVA 1626 Brackets sequence (dp递推 || 记忆化搜索)
- UVA 1331 Minimax Triangulation 最大面积最小的三角剖分(区间dp--记忆化搜索)
- UVA 10118 - Free Candies(记忆化搜索)
- UVA 1252 Twenty Questions 状态压缩dp 记忆化搜索
- UVALive 4864 Bit Counting --记忆化搜索 / 数位DP?
- UVA 1630 Folding——区间DP(记忆化搜索)
- UVa 10651 Pebble Solitaire(DP 记忆化搜索)
- uva 10599 - Robots(II) (dp | 记忆化搜索)
- UVA - 10118 Free Candies(dfs+记忆化搜索)
- UVA 10891 Game of Sum dp(记忆化搜索)
- UVa 10118 - Free Candies(记忆化搜索)
- uva 10453 - Make Palindrome (区间dp,记忆化搜索)
- uva 437 The Tower of Babylon(dp,记忆化搜索)
- UVA 10118 简单DP
- uva 10118 记忆化搜索