题目链接:https://www.luogu.org/problemnew/show/P1057
思路:对于每个位置都只有两种选择可以走,也意味着到达某个位置时它的前一个位置只有两种可能,由此写出状态转移方程dp(i,k)=dp(i-1,k)+dp(i+1,k),因为题目中各位置排成了一个环,所以1位置和n位置需要特判dp(1,k)=dp(n,k-1)+dp(1+1,k1),dp(n,k)=dp(1,k-1)+dp(n-1,k-1).
c++代码:
#include <iostream>
#include <cstring>
using namespace std;
int dp[35][35];
int main() {
int n,m;
cin >> n >> m;
memset(dp,0,sizeof(dp));
dp[1][0]=1;
for(int k=1;k<=m;k++) {
dp[1][k]=dp[n][k-1]+dp[2][k-1];
for(int i=2;i<=n-1;i++)dp[i][k]=dp[i-1][k-1]+dp[i+1][k-1];
dp[n][k]=dp[1][k-1]+dp[n-1][k-1];
}
cout << dp[1][m];
return 0;
}