洛谷P1057&CodevsP1148 传球游戏

(由于不怎么会写环形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
#include
#define f dp
#define maxn 30+5
int 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<

你可能感兴趣的:(DP)