5219. 【GDOI2018模拟7.10】B
题目大意:
现在有一个字符串
s
s
s
当
s
[
i
]
s[i]
s[i]为
I
I
I时
a
n
s
[
i
]
>
a
n
s
[
i
−
1
]
ans[i]>ans[i-1]
ans[i]>ans[i−1];
当
s
[
i
]
s[i]
s[i]为
D
D
D时
a
n
s
[
i
]
<
a
n
s
[
i
−
1
]
ans[i]<ans[i-1]
ans[i]<ans[i−1];
当
s
[
i
]
s[i]
s[i]为
?
?
?时
a
n
s
[
i
]
ans[i]
ans[i]无限制。
考试想法:
考试的时候什么也没想到,所以就打了个暴力。
正解:
考虑𝑠[𝑖 − 1] = ′𝐼′时的转移:
f[𝑖][𝑗] = ∑ f[𝑖− 1][𝑘] 𝑗−1
𝑘=1 ,只需要对f维护一个前缀和即可以做到𝑂(1)地转移。
在要求为下降或者没有限制的时候同理。
代码:
#include<bits/stdc++.h>
using namespace std;
char s[1005];
long long f[1005][1005],sum[1005][1005];
int len,mod=1e9+7,ans;
int main()
{
scanf("%s",s+1);
len=strlen(s+1)+1;
f[1][1]=1;
sum[1][1]=1;
for(register int i=2;i<=len;i++)
{
for(register int j=1;j<=i;j++)
{
if(s[i-1]=='I') f[i][j]=sum[i-1][j-1];
else if(s[i-1]=='D') f[i][j]=(sum[i-1][i-1]-sum[i-1][j-1]+mod)%mod;
else f[i][j]=sum[i-1][i-1];
sum[i][j]=(sum[i][j-1]+f[i][j]+mod)%mod;
}
}
printf("%lld",sum[len][len]);
return 0;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端