题意:

给定字符串,其中’*’表示地雷,’1’表示左/右边有一个地雷相邻,’2’表示左右两边均有地雷相邻,’0’表示左右均无地雷相邻,’?’表示待定,可填入0,1,2或者地雷,有多少种表示方法使字母串满足规定。

分析:

不难想到用dp[i][j]其中j为0,1,2,3(即四种状态),表示下标为i的元素为j状态时,前i+1个字符满足规定的种数。起初这样做,每次都还需要对前一个元素为’1’时进行特殊处理,要分两种情况,不如直接在dp数组中增加一个状态,表示起来也更清晰,即dp[i][j]中j可为0,1,2,3,4,其中0表示字符串下标为i的元素为0,1表示元素为1且前一个元素为地雷,2表示元素为1且前一个元素非地雷(0/1),3表示元素为地雷,4表示元素为’2’。

代码:

#include<iostream>
#include<cstring>
using namespace std;
const int maxn = 1e6 + 5;
long long mod = 1000000007;
long long dp[maxn][5];
int main (void)
{
string a;cin>>a;
memset(dp,0,sizeof(dp));
if(a[0]=='0') dp[0][0] = 1;
else if(a[0] =='1') dp[0][2] = 1;
else if(a[0] =='*') dp[0][3] = 1;
else if(a[0]=='?') {
dp[0][0] = 1;
dp[0][3] = 1;
dp[0][2] = 1;
} for(int i = 1; i < a.length();i++){
if(a[i]=='0') {
dp[i][0] = (dp[i-1][1] + dp[i-1][0])%mod;
}else if(a[i] == '1'){
dp[i][1] = dp[i-1][3]%mod;
dp[i][2] = (dp[i-1][1]+dp[i-1][0])%mod;
}else if(a[i] == '*'){
dp[i][3] = (dp[i-1][4]+dp[i-1][2]+dp[i-1][3])%mod;
}else if(a[i] =='?'){
dp[i][0] = (dp[i-1][1] + dp[i-1][0])%mod;
dp[i][1] = dp[i-1][3]%mod;
dp[i][2] = (dp[i-1][1]+dp[i-1][0])%mod;
dp[i][3] = (dp[i-1][2]+dp[i-1][4]+dp[i-1][3])%mod;
dp[i][4] = dp[i-1][3]%mod;
}else if(a[i] == '2'){
dp[i][4] = dp[i-1][3]%mod;
}
// for(int j= 0; j < 5; j++) cout<<dp[i][j]<<' ';
//cout<<endl;
} int len = a.length()-1;
long long tot=(dp[len][0]+dp[len][1]+dp[len][3])%mod;
cout<<tot<<endl;
}

最新文章

  1. Schema
  2. URL地址中使用中文作为的参数【转】
  3. Jmeter性能测试入门(转)
  4. nginx基于IP的虚拟主机
  5. JMeter学习-007-JMeter 断言实例之一 - 响应断言
  6. DXUT初步理解
  7. SSH_框架整合5--验证用户名是否可用
  8. JS中基本类型与包装类型的关系
  9. C#MongoDB 分页查询的方法及性能
  10. Bootstrap轮播获取当前活动的焦点对象
  11. C# gridview分頁導出excel
  12. 「Poetize3」导弹防御塔
  13. openldap---ldapsearch使用
  14. 用apiCloud开发应用
  15. 原生js
  16. Hibernate(二):MySQL server version for the right syntax to use near &#39;type=InnoDB&#39; at line x
  17. Android的oom详解
  18. IS创新之路 -- 都昌公司赋能型HIT企业发展之路
  19. python跨网段遍历枚举IP地址(转)
  20. Elasticsearch 学习之子聚集过滤

热门文章

  1. iOS捷径(Workflow 2.0)拓展
  2. T4869 某种数列问题 (jx.cpp/c/pas) 1000MS 256MB
  3. flex弹性布局操练2
  4. org.apache.tomcat.util.net.NioEndpoint,打开的文件过多
  5. Farseer.net轻量级ORM开源框架说明及链接索引
  6. IE盒模型和标准w3c盒模型
  7. flex布局(主要分清楚容器和条目)
  8. Matlab中size、numel、length、fix函数的使用
  9. Harris角点检测原理详解
  10. jQuery 开始动画,停止动画