思路:https://codeforces.com/contest/1498/problem/C
代码:有点懒,等会写,具体可以看代码
#includeusing namespace std; typedef long long LL; typedef pair 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--) { memset(dp, 0, sizeof dp); 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("%dn",dp[n][k]); } return 0; }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)