博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu5642 数位dp
阅读量:4622 次
发布时间:2019-06-09

本文共 1427 字,大约阅读时间需要 4 分钟。

题目链接:

题意:一个长度为n的序列,合法序列为字符中不能出现长度大于3的连续相等的字符,求一共有多少个合法序列。

好久之前写过两道数位dp,早就不记得是什么了。。总之数位dp中,总有一维数组是要代表位数的。

代码如下,思路见注释。

#include
#include
#include
#include
#include
using namespace std;const int MOD=1e9+7;int dp[2005][30];//dp[i][j] 表示长度为i结尾字符为j的合法字符有多少种void init(){ memset(dp,0,sizeof(dp)); for(int i=0; i<26; i++) //前三位都是合法字符,初始化数值 { dp[1][i]=1; dp[2][i]=26; dp[3][i]=676; } for(int i=4; i<=2000; i++) { for(int j=0; j<26; j++) //连续三个字符相等的 for(int k=0; k<26; k++) { if(k==j) continue; dp[i][j]=(dp[i][j]+dp[i-3][k])%MOD; } for(int j=0; j<26; j++) //连续两个字符相等的 for(int k=0; k<26; k++) { if(k==j) continue; dp[i][j]=(dp[i][j]+dp[i-2][k])%MOD; } for(int j=0; j<26; j++) //连续一个字符相等的 for(int k=0; k<26; k++) { if(k==j) continue; dp[i][j]=(dp[i][j]+dp[i-1][k])%MOD; } }}int main(){ init(); int T,n; scanf("%d",&T); while(T--) { scanf("%d",&n); int ans=0; for(int i=0; i<26; i++) ans=(ans+dp[n][i])%MOD; printf("%d\n",ans); } return 0;}

 

转载于:https://www.cnblogs.com/a-clown/p/5966258.html

你可能感兴趣的文章
通过trace分析优化其如何选择执行计划
查看>>
ORACLE 表函数实现
查看>>
[嵌入式开发板学习分享]迅为i.MX6开发板QT 鼠标和触摸的问题
查看>>
二分法
查看>>
网络层
查看>>
python 中的queue 与多进程--待继续
查看>>
MyBatis学习笔记(四)一多一关系
查看>>
turtle基础练习
查看>>
《Programming in Objective-C 3rd Edition》阅读笔记(1)
查看>>
pycharm的一些常用设置(文件模板、代码字体、编译器)
查看>>
oracle相关
查看>>
java学习笔记之单例模式
查看>>
java学习笔记之初识JDBC
查看>>
织梦dedecms会员中心分类管理无法修改、删除分类名
查看>>
Python day39 :非阻塞IO模型 select /epoll 及使用方法
查看>>
vue学习
查看>>
codevs 1153 道路游戏
查看>>
读书笔记五--numpy
查看>>
答CsdnBlogger问-关于安卓入行和开发问题
查看>>
psutil模块安装指南(win与linux)
查看>>