[恢]hdu 1517

2011-12-23 07:30:49

地址:http://acm.hdu.edu.cn/showproblem.php?pid=1517

题意:S和O玩游戏,S先动。一开始P=1,每次让它乘以2或9,超过n的获胜。问最后谁赢。

mark:虽然是博弈。。。但是貌似很麻烦,直接记忆化爆之。。。

代码:

# include <stdio.h>
# include <string.h>


int dp[40][40] ;
long long n ;


long long pow(int a, int b)
{
long long ans = 1 ;
int i ;
for (i = 0 ; i < b ; i++)
ans *= (long long)a ;
return ans ;
}


int dfs(int f2, int f9)
{
if (dp[f2][f9] != -1) return dp[f2][f9] ;
if (pow(2,f2) * pow(9,f9) >= n) return dp[f2][f9] = 0 ;
if (dfs (f2+1, f9)==0 || dfs (f2,f9+1) ==0)
return dp[f2][f9] = 1 ;
return dp[f2][f9] = 0 ;
}


int main ()
{
while (~scanf ("%I64d", &n))
{
memset (dp, -1, sizeof(dp)) ;
dfs (0,0) ;
puts (dp[0][0]? "Stan wins." : "Ollie wins.") ;
}
return 0 ;
}



posted @ 2012-01-06 23:28  Seraph2012  阅读(128)  评论(0编辑  收藏  举报