Bachet's Game(博弈,dp)

思路:这是博弈dp。

dp[i]=1意思是i个石头的时候先手是赢家,0则是输家

首先如果我们想stan赢下比赛,那么就要让dp[n-take[j]]=0(即能拿下最后一个石头的前一次赢家要是ollie),那就保证了下一次出手的必然是先手者且必然拿下最后一块石头,这里的dp[n-take[j]]=0只需要出现哪怕一次也足够了,因为题目有说到二者都想尽力赢下游戏,所以哪怕出现了一次stan也一定会把握机会拿下胜利

#include
#include
int dp[1000001];
int main()
{
  int j,k,i=0,n,kind,q;
  while(scanf("%d %d",&n,&kind)!=EOF)
  {
      int take[11];
      memset(dp,0,sizeof(dp));
      for(q=0;q<=kind-1;q++)
      {
          scanf("%d",&take[q]);
      }
      for(i=1;i<=n;i++)
      {
          for(j=0;j<=kind-1;j++)
          {
              if(i>=take[j]&&dp[i-take[j]]==0)
              {
                  dp[i]=1;break;
              }
          }
      }
      if(dp[n]==1)printf("Stan wins\n");
      else printf("Ollie wins\n");
  }
return 0;
}

你可能感兴趣的:(dp)