P1057 传球游戏

匿名 (未验证) 提交于 2019-12-03 00:39:02

这道题是水题了吧,可惜我之前还是写错了。

这是我后来做这道题的草稿:

\(dp[i][j]\)为球在\(i\)手上,还需传\(j\)次的方案数,那么,状态转移方程就是:

\[dp[i][j] = dp[i + 1][j - 1] + dp[i - 1][j - 1]\]

当然要特殊考虑\(i==1\)\(n\)的情况。

最后答案就是\(dp[1][m]\),注意不要输错了。

不会递推,只会记忆化。

代码:

#include<cstdio> #include<cstring> const int maxn = 40; int dp[maxn][maxn]; int n, m; int solve(int i, int j) {     if(dp[i][j] != -1) return dp[i][j];     int ans = 0;     if(j == 0)     {         if(i == 1) ans = 1;     }     else if(i == 1)     {         ans = solve(2, j - 1) + solve(n, j - 1);     }     else if(i == n)     {         ans = solve(n - 1, j - 1) + solve(1, j - 1);     }     else     {         ans = solve(i + 1, j - 1) + solve(i - 1, j - 1);     }     return dp[i][j] = ans; } int main() {     memset(dp, -1, sizeof(dp));     scanf("%d%d", &n, &m);     printf("%d\n", solve(1, m));     return 0; }

原文:https://www.cnblogs.com/Garen-Wang/p/9247861.html

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!