题目链接:
https://codeforces.com/contest/1498/problem/C
思路:
有点懒,等会写,具体可以看代码
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 1e3 + 10, MOD = 1e9 + 7;
int dp[N][N];
//dp[i][j]代表当前还有i个墙才能穿出去,衰变等级为j的这个射线的能分离出多少个射线
//dp[i][j] = dp[i - 1][j] + dp[n - i][j - 1];
// 由: 没有反射的 反射得到的
int main()
{
int t;
scanf("%d", &t);
while(t--)
{
int n, k;
scanf("%d %d", &n, &k);
//衰变等级为1的始终只能有一条射线
for(int i = 1; i <= n; i++) dp[i][1] = 1;
//没有墙的话,没有反射,那也只有1条射线
for(int i = 1; i <= k; i++) dp[0][i] = 1;
//先遍历j是因为先遍历i的话会出问题,遍历j才会得到固定的值
//因为dp[n - i][j - 1]是上一层遍历就已经得到的
//而dp[i - 1][j]是刚才得到的,所以不重不漏
for(int j = 1; j <= k; j++)
{
for(int i = 1; i <= n; i++)
{
dp[i][j] = (dp[i - 1][j] + dp[n - i][j - 1]) % MOD;
}
}
printf("%d\n",dp[n][k]);
}
return 0;
}