牛客练习赛104 C 1919810
https://ac.nowcoder.com/acm/contest/43058/C
思路
一个很简单的dp
记录每一位i可以给下一位的j提供的方案数
理论上层数应该倒着枚举,但是我这个写法恰好避免了重复,所以正着倒着都是对的
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#include<bitset>
#define ll long long
#define gc getchar
#define maxn 1000005
#define mo 1000000007
using namespace std;
inline ll read(){
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}int n;
ll ans,f[10][15];
char s[maxn];
int main(){
scanf("%s",s+1);
n=strlen(s+1);
for(int i=1;i<=n;++i){
int d=s[i]-'0';
if(i>=7)ans=(ans+f[6][d])%mo;
if(i>=6)
for(int j=d-1;~j;--j)
f[6][j]=(f[6][j]+f[5][d])%mo;
if(i>=5)
for(int j=d-1;~j;--j)
f[5][j]=(f[5][j]+f[4][d])%mo;
if(i>=4)
for(int j=d-1;~j;--j)
f[4][j]=(f[4][j]+f[3][d])%mo;
if(i>=3)
for(int j=d+1;j<=9;++j)
f[3][j]=(f[3][j]+f[2][d])%mo;
if(i>=2)
for(int j=d-1;~j;--j)
f[2][j]=(f[2][j]+f[1][d])%mo;
for(int j=d+1;j<=9;++j)
++f[1][j];
}
printf("%lld\n",ans);
return 0;
}
所有文字著作权归本人所有,禁止转载抄袭,若盗版进行商业运营,本人必将追究到底。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧