P1057 [NOIP2008 普及组] 传球游戏

链接:https://www.luogu.com.cn/problem/P1057
思路:左手倒右手,建立递推方程
建立初始参数:定义dp[j][k]是第k次,以j结尾的方法,就是传k次最后传到j的方法。
那么状态转移方程:dp[j][k]=dp[next][k-1]+dp[before][k-1]
其中before是j的前一个元素(j-1);next是j的后一个元素j+1。同时要注意从1到n的转换
nxt = (!nxt) ? n : nxt, bef = (bef) ? bef : n;
没想到一次过了OWO!!

#define _CRT_SECURE_NO_WARNINGS 0
#include<iostream>
#include<vector>
#include<algorithm>
#include<math.h>
#include<sstream>
#include<string>
#include<string.h>
#include<iomanip>
#include<stdlib.h>
#include<map>
#include<queue>
#include<limits.h>
#include<climits>
#include<fstream>
#include<stack>
typedef long long ll;
using namespace std;
const int N = 50;
ll dp[N][N];
int main()
{
	int n, m; cin >> n >> m;
	memset(dp, 0, sizeof(dp));
	dp[1][0] = 1;
	for (int k = 1; k <= m; k++)
	{
		for (int j = 1; j <= n; j++)
		{
			if (j - 1 <= k or 1 + n - j <= k)
			{
				int nxt = (j + 1) % n, bef = (j - 1) % n;
				nxt = (!nxt) ? n : nxt, bef = (bef) ? bef : n;
				dp[j][k] += dp[nxt][k - 1] + dp[bef][k - 1];
			}
		}
	}
	cout << dp[1][m];

	return 0;
}

posted on 2024-05-20 16:42  WHUStar  阅读(14)  评论(0编辑  收藏  举报