[ 洛谷]P1057 [NOIP2008 普及组] 传球游戏

dp一次ac,比较简单。思路也比较明细

就是第i次传球,球在j同学手上的情况,为第i-1次传球,球在j+1和j-1同学情况的和

f(i,j)=f(i-1,j-1)+f(i-1,j+1)

注意1和n的边界情况单独讨论,具体看代码

#include 
#define N 100
using namespace std;
int i, j, k;
int n, m;
int ans;

int f[10000][10000] = {0}; //传第i次时,球在j同学的情况。


int main() {
	cin >> n >> m;
	f[0][1] = 1;

	for (i = 1; i <= m; i++)
		for (j = 1; j <= n; j++) {
			if (j == 1)
				f[i][j] = f[i - 1][j + 1] + f[i - 1][n];
			else if (j == n)
				f[i][j] = f[i - 1][1] + f[i - 1][j - 1];

			else
				f[i][j] = f[i - 1][j + 1] + f[i - 1][j - 1];
		}

	cout << f[m][1];

}

你可能感兴趣的:(dp,游戏,算法,c++)