标签:can mes line 循环 ons 这一 clu lan ==
这道题开始将题意看错了,将它打成了一道思维题,事后才发现这是一道DP。果然还是我太菜了
\(dp[i][j]\)表示第\(i\)行j个缩进的总方案数。
(1) 当前一行为\(f\)
这时由题意得这一行必须在上一行的基础上缩进一格(且只能为一格)
所以\(dp[i][j] = dp[i - 1][j - 1];\)
(2)当前一行为\(s\)
这时我们可以任意缩进,但是要注意因为上一格是\(s\)所以这一行不能缩进,即若这一行为i,上一行只能在i~n中取值。所以我们可以用一个倒叙循环对每一次的个数累加。
#include <iostream>
#include <cstdio>
using namespace std;
const int MAXN = 5005, mod = 1e9 + 7;
long long dp[MAXN][MAXN], n;
char a[MAXN];
int main() {
scanf("%lld", &n);
for (int i = 1; i <= n; i++) cin>>a[i];
dp[1][0] = 1;
for (int i = 2; i <= n; i++) {
if (a[i - 1] == ‘f‘) {
for (int j = 1; j <= i; j++) dp[i][j] = dp[i - 1][j - 1];
} else {
long long sum = 0;
for (int j = i; j >= 0; j--) {
sum = (sum + dp[i - 1][j]) % mod;
dp[i][j] = sum;
}
}
}
long long zsum = 0;
for (int i = 0; i <= n; i++) zsum = (zsum + dp[n][i]) % mod;
printf("%lld", zsum);
return 0;
}
标签:can mes line 循环 ons 这一 clu lan ==
原文地址:https://www.cnblogs.com/cqbzlipengcheng/p/14868224.html