UVA 10118 Free Candies
2011-12-05 21:24
387 查看
UVA_10118
我们可以定义f[n1][n2][n3][n4]为当四个piles分别拿到第n1、n2、n3、n4个糖果时,能够拿回家的最多的pair数,然后在状态转移的时候需要借助一个数组来记录basket的情况,可以容易想象的是,对于一个f状态,一定有唯一一个basket的状况(当然假设能取走的糖果都取走了)与之相对应。
为了实现起来更方便,我还是选用了记忆化搜索。
我们可以定义f[n1][n2][n3][n4]为当四个piles分别拿到第n1、n2、n3、n4个糖果时,能够拿回家的最多的pair数,然后在状态转移的时候需要借助一个数组来记录basket的情况,可以容易想象的是,对于一个f状态,一定有唯一一个basket的状况(当然假设能取走的糖果都取走了)与之相对应。
为了实现起来更方便,我还是选用了记忆化搜索。
#include<stdio.h> #include<string.h> #define MAXD 50 int N, f[MAXD][MAXD][MAXD][MAXD], x[5][MAXD]; int init() { int i, j; scanf("%d", &N); if(!N) return 0; for(i = 0; i < N; i ++) for(j = 0; j < 4; j ++) scanf("%d", &x[j][i]); return 1; } int dp(int y[], int s, int t[]) { int i, j, k, max = 0; if(f[t[0]][t[1]][t[2]][t[3]] != -1) return f[t[0]][t[1]][t[2]][t[3]]; if(s == 5) return f[t[0]][t[1]][t[2]][t[3]] = 0; for(i = 0; i < 4; i ++) if(t[i] != N) { int r[25]; memcpy(r, y, sizeof(r)); int top[5]; memcpy(top, t, sizeof(top)); top[i] ++; if(r[x[i][t[i]]]) { r[x[i][t[i]]] = 0; k = dp(r, s - 1, top); if(k + 1 > max) max = k + 1; } else { r[x[i][t[i]]] = 1; k = dp(r, s + 1, top); if(k > max) max = k; } } return f[t[0]][t[1]][t[2]][t[3]] = max; } void solve() { int res, r[25] = {0}, top[5] = {0}; memset(f, -1, sizeof(f)); res = dp(r, 0, top); printf("%d\n", res); } int main() { while(init()) solve(); return 0; }
相关文章推荐
- UVA 10118 Free Candies
- uva 10118 Free Candies
- UVA-10118 Free Candies (DP、记忆化搜索)
- UVA - 10118 Free Candies
- 算法竞赛入门经典 第二版 习题9-2 免费糖果 Free Candies uva10118
- UVA 10118 Free Candies 记忆化搜索 dp紫书9-2
- UVa 10118 Free Candies (记忆化搜索+状态压缩)
- UVa 10118 - Free Candies(记忆化搜索)
- uva 10118 - Free Candies
- UVA - 10118 Free Candies
- uva 10118 Free Candies
- 【DP 训练】Free Candies, UVa 10118
- UVa 10118 Free Candies(记忆化搜索经典)
- UVA10118_Free Candies状态压缩
- UVA 10118 Free Candies
- uva 10118 (Free Candies)(DP)
- UVa 10118 记忆化搜索 Free Candies
- UVA - 10118 Free Candies(dp 与状态所对应的信息)
- UVA 10118 Free Candies
- UVA 10118 - Free Candies