线性dp应该是dp中比较简单的一类,不过也有难的。(矩乘优化递推请出门右转)
传球游戏:https://www.luogu.org/problemnew/show/P1057
题意概述:一些人围成一个圈,每次可以把球传给左右两个人,求m步后回到第一个人手里的方案数。
这题大概也可以矩乘?不过递推就可以了,$dp[i][j]$表示传了j步,现在在i手里的方案数。转移:
$dp[i][j]=dp[i+1][j-1]+dp[i-1][j-1]$
边界再处理一下就行了。
# include <cstdio> # include <iostream> using namespace std; int n,m; long long dp[31][31]; int main() { scanf("%d%d",&n,&m); dp[1][0]=1; for (int i=1;i<=m;i++) { dp[1][i]=dp[2][i-1]+dp[n][i-1]; dp[n][i]=dp[n-1][i-1]+dp[1][i-1]; for (int j=2;j<n;j++) dp[j][i]=dp[j-1][i-1]+dp[j+1][i-1]; } printf("%d",dp[1][m]); return 0; }
传球游戏
原文地址:https://www.cnblogs.com/shzr/p/9200727.html
时间: 2024-10-09 23:50:25