题目链接:http://acm.split.hdu.edu.cn/showproblem.php?pid=5642

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

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

代码如下,思路见注释。

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

最新文章

  1. SSH框架整合
  2. canvas画圆(一)
  3. 二十五、JDK1.5新特性---枚举
  4. 浅谈VB.Net 程序的编译和动态编译
  5. Python 简介和入门
  6. eBay 消息发送(2)
  7. ubuntu 14.10 安装 zabbix
  8. android129 zhihuibeijing 聊天机器人
  9. Js解析json
  10. grb文件的读取
  11. HER COFFEE夜场代金券【1折】_北京美食团购_360团购导航
  12. Card Game Cheater(贪心+二分匹配)
  13. centos 推荐使用epel源
  14. [Programming WCF Services]Chapter&#160;1.&#160;WCF Essentials - Metadata Exchange
  15. [POJ1088] 滑雪(递归dp)
  16. BZOJ 2806: [Ctsc2012]Cheat [广义后缀自动机 单调队列优化DP 二分]
  17. js复制内容到剪贴板
  18. 消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局
  19. 【sock_stream和sock_dgram】、 【AF_INET和AF_UNIX】
  20. Java并发编程-AbstractQueuedSynchronizer源码分析

热门文章

  1. 使用CSS中margin和padding的基础和注意事项
  2. Office文件的Open Xml 格式
  3. 如何激活webstorm 11
  4. android SDK 更新问题完美解决 http://dl-ssl.google.com refused
  5. Django搭建简易博客
  6. Yslow网站性能优化工具
  7. mysql可以用这种方式&lt;&lt;! 输入内容 ! 做成脚本
  8. Clr Via C#读书笔记---程序集的加载和反射
  9. SQLAchemy Core学习之Reflection
  10. Java Hour 63 反射