ZOJ 3057 组合博弈 DP

来源:互联网 发布:阿里云邮箱忘记密码 编辑:程序博客网 时间:2024/06/03 18:48

一开始超时了,后来发现不能由已知的必败态导出的必胜态还是必败态(虽然还是有点模糊)

然后MLE,只能把数组开成bool 总算过了

#include <set>#include <cmath>#include <cstdio>#include <cstring>template <class T> inline  T MAX(T a, T b){if (a > b) return a;return b;}template <class T> inline  T MIN(T a, T b){if (a < b) return a;return b;}bool sg[301][301][301];void dfs1(int a, int b, int c){    int i, lim;    for (i = a + 1; i <= 300; ++i)        sg[i][b][c] = 1;    for (i = b + 1; i <= 300; ++i)        sg[a][i][c] = 1;    for (i = c + 1; i <= 300; ++i)        sg[a][b][i] = 1;    lim = MIN(300 - b, 300 - a);    for (i = 1; i <= lim; ++i)        sg[a + i][b + i][c]  =1;    lim = MIN(300 - b, 300 - c);    for (i = 1; i <= lim; ++i)        sg[a][b + i][c + i] = 1;    lim = MIN(300 - a, 300 - c);    for (i = 1; i <= lim; ++i)        sg[a + i][b][c + i] = 1;}void init(){    memset(sg, false, sizeof(sg));    sg[0][0][0] = 0;    dfs1(0, 0, 0);    for (int i = 0; i <= 300; ++i)        for (int j = 0; j <= 300; ++j)            for (int k = 0; k <= 300; ++k)            {                if (sg[i][j][k]) continue;                dfs1(i, j, k);            }}int main(){    int a[10];    init();    while (scanf("%d%d%d", &a[0], &a[1], &a[2]) != EOF)    {//        sort(a, a + 3);        printf("%d\n", sg[a[0]][a[1]][a[2]]);    }    return 0;}


 

原创粉丝点击