摘要:
HDU_1400 借用了一下插头dp中轮廓线的思想,用1表示轮廓线上对应位置是空的,0表示对应位置已经放上了东西,然后逐格进行dp。 如果递推到当前格子时,上方格子是1,那么这个格子和上一个格子就必须一起放一块竖着的骨牌,否则接下来上面那个格子就不会再填上骨牌了。 如果递推到当前格子时,上方格子是0,这时看左边的格子,如果是0的话,那么当前这个格子就只能空着了,如果是1的话,那么当前这个格子可以空着,也可以和左边的格子一起放一块横着的骨牌。#include<stdio.h>#include<string.h>#include<algorithm>#defin 阅读全文
摘要:
HDU_3001 相比于普通的TSP问题,这个题加了“每个点之多经过两次”的限制,因此改用三进制表示每个点的状态就可以了。#include<stdio.h>#include<string.h>#include<algorithm>#define INF 0x3f3f3f3f#define MAXD 15#define ST 59049int N, M, D, g[MAXD][MAXD], f[ST][MAXD], ANS;int bit[] = {1, 3, 9, 27, 81, 243, 729, 2187, 6561, 19683, 59049};voi 阅读全文
摘要:
HDU_3559 如果定义终态为不能再继续传递Frost Chain的状态,那么终态的概率和应该是1。每个人死亡的概率就是他的血量为0的各个终态的概率和,于是dp出各个终态出现的概率即可。#include<stdio.h>#include<string.h>#define MAXD 7776double f[MAXD][5], a[MAXD];int vis[MAXD][5];int N, D, limit[5], code[5], q[5];const int M = 7776;struct Point{ int x, y;}p[5];int sqr(int x){ 阅读全文
摘要:
HDU_3620 设f[i][x][y]表示第i个动作结束之后位置在(x,y)的最大步数,那么f[i][x][y]=std::max{f[i-1][x'][y']+distance((x,y),(x',y'))},然后根据第i个动作的行走方向来遍历数组并进行dp就可以了。但是由于每个动作可以向前行走的最大步数为200,如果再加一维循环表示这个动作走了多少步的话就会超时,不过可以用单调队列优化掉这一维,使得每次的决策都是O(1)的。 此外,每次移动的步数可以是0,也就是不移动。#include<stdio.h>#include<string.h& 阅读全文