hdu 4753 Fishhead’s Little Game (记忆化搜索+状态压缩)

类目类型和 这题很像 点击打开链接

记忆化搜索,总分为9分,当前场上剩下的总分减去下一个人能拿到的最多的分数,就是当前玩家能拿到的分数,取最大值就是最优选择。

由于最多可能有12条边,所以取边的状态可以用二进制状态压缩表示,10000的数组就足够存下了。

#include
#include
#include
#include
#include
using namespace std;
bool use[30];
bool vis[30][30];
int n;
int a,b;
int dp[1000000];
struct node
{
    int x,y;
}ed;
vector v;
int check1(int x,int y)
{
    if(x>y)
        swap(x,y);
    int x2 = x-4;
    int y2 = y-4;
    int ret=0;
    if(x2>0 && y2>0)
    {
        if(vis[x][x2] && vis[x2][y2] && vis[y2][y] && vis[x][y])
            ret++;
    }
    x2 = x+4;
    y2 = y+4;
    if(x2<17 && y2<17)
    {
        if(vis[x][x2] && vis[x2][y2] && vis[y2][y] && vis[x][y])
            ret++;
    }
    return ret;
}
int check2(int x,int y)
{
    if(x>y)
        swap(x,y);
    int x2,y2;
    x2 = x-1;
    y2 = y-1;
    int ret=0;
    if(x2%4!=0 && y2%4!=0 && x2>0 && y2>0)
    {
        if(vis[x2][x] && vis[x][y] && vis[y][y2] && vis[y2][x2])
            ret++;
    }
    x2 = x+1;
    y2 = y+1;
    if(x%4!=0 && y%4!=0)
    {
        if(vis[x2][x] && vis[x][y] && vis[y][y2] && vis[y2][x2])
            ret++;
    }
    return ret;
}
int dfs(int now,int last)
{
    if(now==25||last==0) return 0;
    int st=0;
    for(int i=0;i=5||b>=5) {printf("Case #%d: %s\n",ca++,a>=5?"Tom200":"Jerry404");continue;}
        memset(dp,-1,sizeof(dp));
        memset(use,false,sizeof(use));
        if(n+1<=24)
        {
            if((n+1)&1) {a+=dfs(n+1,9-a-b);b=9-a;}
            else {b+=dfs(n+1,9-a-b);a=9-b;}
        }
        printf("Case #%d: %s\n",ca++,a>b?"Tom200":"Jerry404");
    }
    return 0;
}
/*
6
5 6
2 3
3 7
7 11
10 11
3 4
*/



你可能感兴趣的:(搜索,dp)