【动态规划】P1057 传球游戏_算法

这题思路和数塔游戏/走楼梯 类似,都是找当前位置,是由哪个位置转移过来的,

只要在转移的过程中,找出状态是怎么变的即可

【动态规划】P1057 传球游戏_算法_02

初始化:

dp[1][0]=1:没传的时候在1位置

dp[2][1]=1:1向右传

dp[n][1]=1:1向左传

dp[i][1]=0:其他位置传一步不能传到为0(不用初始化,因为默认为0) 

 

【动态规划】P1057 传球游戏_动态规划_03

代码:

#include<iostream>
using namespace std;
int n,m;
int dp[31][31];
int main(){
	cin>>n>>m;
	dp[1][0]=1;
	dp[2][1]=1;
	dp[n][1]=1;
	for(int j=1;j<=m;j++){
		for(int i=1;i<=n;i++){
			if(i!=n&&i!=1)
			dp[i][j]=dp[i+1][j-1]+dp[i-1][j-1];
			else if(i==n){
				dp[i][j]=dp[1][j-1]+dp[i-1][j-1];
			}
			else
			{
				dp[i][j]=dp[i+1][j-1]+dp[n][j-1];
			}
			
		}
	}
	cout<<dp[1][m];
	
}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.
  • 6.
  • 7.
  • 8.
  • 9.
  • 10.
  • 11.
  • 12.
  • 13.
  • 14.
  • 15.
  • 16.
  • 17.
  • 18.
  • 19.
  • 20.
  • 21.
  • 22.
  • 23.
  • 24.
  • 25.
  • 26.

循环数组方法:

for(int i=1;i<=m;i++){
		for(int j=0;j<=n-1;j++){
			dp[i][j]=dp[i-1][(j-1+n)%n]+dp[i-1][(j+1)%n];
		}
	}
  • 1.
  • 2.
  • 3.
  • 4.
  • 5.