洛谷P1057&CodevsP1148 传球游戏

来源:互联网 发布:淘宝淘金币兑换区 编辑:程序博客网 时间:2024/05/18 02:51
(由于不怎么会写环形DP,特水此题
记忆化搜索

f[i][j]=f(i-1,j-1)+f(i+1,j-1)

当i<0时,i+=n;
当i>=n时,i%=n;

写记忆化搜索很坑爹的一个问题,如果直接把dp数组当作vis来用的话会死循环,因为可能没有方案,因此dp数组全都是0#-_-
#include<iostream>#include<cstring>#define f dp#define maxn 30+5int dp[maxn][maxn];bool vis[maxn][maxn];int n,m;using namespace std;int solve(int i,int j){    if(j<0||j>m)return 0;    if(i>n)i%=n;    if(i<=0)i+=n;    if(vis[i][j])return dp[i][j];    f[i][j]=solve(i-1,j-1)+solve(i+1,j-1);    vis[i][j]=1;    return f[i][j];}int main(){    ios::sync_with_stdio(false);    cin>>n>>m;    memset(dp,0,sizeof(dp));    memset(vis,0,sizeof(vis));    //f[i][j]表示传到第i个人,第j次的答案    //f[i][j]=f[i-1][j-1]+f[i+1][j-1];    f[1][0]=1;    vis[1][0]=1;    cout<<solve(1,m);    return 0;}

0 0