【博弈&动态规划】poj2068Nim

来源:互联网 发布:数据精度 英文 编辑:程序博客网 时间:2024/06/07 09:23

记忆化的搜索,在数据规模较小的情况下比较好用。

这道博弈的题目完全可以借助于动态规划求解,形式上是递归,实质上借助于一个数组避免了重复的计算。

代码如下:

#include<iostream>using namespace std;int search(int count,int leftNumber);int n,maxNumber[50];int dp[25][10001];int main(){int total;while(cin>>n&&n){cin>>total;n=n*2;for(int i=0;i<n;i++)cin>>maxNumber[i];for(int i=0;i<n;i++)for(int j=0;j<=total;j++)dp[i][j]=-1;//the process of initializationsearch(0,total);cout<<dp[0][total]<<endl;}//system("pause");return 0;}int search(int count,int leftNumber){if(dp[count][leftNumber]!=-1)return dp[count][leftNumber];//boundary conditionsif(leftNumber==0){dp[count][leftNumber]=1;return 1;}else if(leftNumber==1){dp[count][leftNumber]=0;return 0;}for(int i=1;i<=maxNumber[count];i++){if((leftNumber-i)>=0&&search((count+1)%n,leftNumber-i)==0){dp[count][leftNumber]=1;return 1;}}dp[count][leftNumber]=0;return 0;}


原创粉丝点击