Solution - CF909C
Solution.#
很显然的一道 DP 。
定义状态 为在第 行有 个换行的方案数。
假设第 行为 ,那么第 行就必须多一个换行,所以
否则第 行为 ,此时不难推出第 行换行个数的范围是 ,则 。
此时时间复杂度为 ,还不够优秀。
我们可以注意到 可以用前缀和来维护。这样复杂度就降为 。
Code.#
#include <bits/stdc++.h>
#define int long long
using namespace std;
template <typename T>
void read(T &x) {
x = 0; T f = 1;
char c;
c = getchar();
while (c < '0' || c > '9') {
if (c == '-') f = -1;
c = getchar();
}
while (c >= '0' && c <= '9') {
x = (x << 1) + (x << 3) + c - '0';
c = getchar();
}
x *= f;
}
const int MOD = 1e9 + 7;
char a[5005];
int dp[5005][5005];
int sum[5005];
int n;
signed main() {
read(n);
for (int i = 1; i <= n; i++) {
cin >> a[i];
}
dp[1][0] = 1;
for (int i = 1; i <= n; i++) {
for (int j = 0; j <= i; j++) {
if (a[i - 1] == 'f') dp[i][j] = dp[i - 1][j - 1] % MOD;
else {
dp[i][j] = (dp[i][j] + sum[i - 2] - sum[j - 1] + MOD) % MOD;
}
}
for (int j = 0; j <= i; j++) {
sum[j] = (sum[j - 1] + dp[i][j]) % MOD;
}
}
int ans = 0;
for (int i = 0; i <= n; i++) {
ans = (ans + dp[n][i]) % MOD;
}
printf("%lld", ans);
return 0;
}
作者: cqbzjyh
出处:https://www.cnblogs.com/cqbzjyh/p/15998118.html
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 因为Apifox不支持离线,我果断选择了Apipost!
· 通过 API 将Deepseek响应流式内容输出到前端