2013-12-4-有趣的数
题目链接
http://118.190.20.162/view.page?gpid=T2
题解
本
题
考
察
点
在
于
观
察
满
足
性
质
的
序
列
种
类
,
发
现
种
类
并
不
多
本题考察点在于观察满足性质的序列种类,发现种类并不多
本题考察点在于观察满足性质的序列种类,发现种类并不多
一
共
有
13
个
合
法
状
态
,
于
是
我
们
只
要
可
以
推
理
出
13
个
合
法
状
态
之
间
的
转
移
方
程
就
可
以
。
一共有13个合法状态,于是我们只要可以推理出13个合法状态之间的转移方程就可以。
一共有13个合法状态,于是我们只要可以推理出13个合法状态之间的转移方程就可以。
首
先
我
们
给
出
13
个
合
法
状
态
:
首先我们给出13个合法状态:
首先我们给出13个合法状态:
1
由
1
转
移
−
−
−
−
1
状
态
1 由1转移 ----1状态
1由1转移−−−−1状态
2
由
2
转
移
−
−
−
−
2
状
态
2 由 2 转移 ----2状态
2由2转移−−−−2状态
3
由
3
转
移
−
−
−
−
3
状
态
3 由 3 转移 ----3状态
3由3转移−−−−3状态
02
由
2
4
转
移
−
−
−
−
4
状
态
02 由 2 \ 4转移 ----4状态
02由2 4转移−−−−4状态
03
由
3
5
转
移
−
−
−
−
5
状
态
03 由 3 \ 5 转移 ----5状态
03由3 5转移−−−−5状态
12
由
1
2
6
转
移
−
−
−
−
6
状
态
12 由1 \ 2 \ 6 转移 ----6状态
12由1 2 6转移−−−−6状态
13
由
1
3
7
转
移
−
−
−
−
7
状
态
13 由1 \ 3 \ 7转移 ----7状态
13由1 3 7转移−−−−7状态
23
由
2
8
转
移
−
−
−
−
8
状
态
23 由 2 \ 8 转移 ----8状态
23由2 8转移−−−−8状态
012
由
4
9
转
移
−
−
−
−
9
状
态
012 由 4 \ 9 转移 ----9状态
012由4 9转移−−−−9状态
013
由
5
10
转
移
−
−
−
−
10
状
态
013由 5 \ 10 转移 ----10状态
013由5 10转移−−−−10状态
023
由
4
8
11
转
移
−
−
−
−
11
状
态
023 由 4 \ 8 \ 11转移 ----11状态
023由4 8 11转移−−−−11状态
123
由
6
12
转
移
−
−
−
−
12
状
态
123 由 6 \ 12 转移 ----12状态
123由6 12转移−−−−12状态
0123
由
9
11
13
转
移
−
−
−
−
13
状
态
0123 由9 \ 11 \ 13 转移 ----13状态
0123由9 11 13转移−−−−13状态
我
们
定
义
d
p
[
i
]
[
j
]
为
数
字
长
度
为
i
状
态
为
j
的
数
字
种
类
数
我们定义dp[i][j]为数字长度为i状态为j的数字种类数
我们定义dp[i][j]为数字长度为i状态为j的数字种类数
很
明
显
初
始
状
态
的
定
义
为
:
很明显初始状态的定义为:
很明显初始状态的定义为:
d
p
[
1
]
[
1
]
=
1
,
d
p
[
1
]
[
2
]
=
1
,
d
p
[
1
]
[
3
]
=
1
;
dp[1][1]=1,dp[1][2]=1,dp[1][3]=1;
dp[1][1]=1,dp[1][2]=1,dp[1][3]=1;
我
们
很
容
易
得
到
状
态
转
移
方
程
:
我们很容易得到状态转移方程:
我们很容易得到状态转移方程:
d
p
[
i
]
[
1
]
=
d
p
[
i
−
1
]
[
1
]
;
dp[i][1]=dp[i-1][1];
dp[i][1]=dp[i−1][1];
d
p
[
i
]
[
2
]
=
d
p
[
i
−
1
]
[
2
]
;
dp[i][2]=dp[i-1][2];
dp[i][2]=dp[i−1][2];
d
p
[
i
]
[
3
]
=
d
p
[
i
−
1
]
[
3
]
;
dp[i][3]=dp[i-1][3];
dp[i][3]=dp[i−1][3];
d
p
[
i
]
[
4
]
=
d
p
[
i
−
1
]
[
2
]
+
2
∗
d
p
[
i
−
1
]
[
4
]
;
dp[i][4]=dp[i-1][2]+2*dp[i-1][4];
dp[i][4]=dp[i−1][2]+2∗dp[i−1][4];
d
p
[
i
]
[
5
]
=
d
p
[
i
−
1
]
[
3
]
+
2
∗
d
p
[
i
−
1
]
[
5
]
;
dp[i][5]=dp[i-1][3]+2*dp[i-1][5];
dp[i][5]=dp[i−1][3]+2∗dp[i−1][5];
d
p
[
i
]
[
6
]
=
d
p
[
i
−
1
]
[
1
]
+
d
p
[
i
−
1
]
[
2
]
+
2
∗
d
p
[
i
−
1
]
[
6
]
;
dp[i][6]=dp[i-1][1]+dp[i-1][2]+2*dp[i-1][6];
dp[i][6]=dp[i−1][1]+dp[i−1][2]+2∗dp[i−1][6];
d
p
[
i
]
[
7
]
=
d
p
[
i
−
1
]
[
1
]
+
d
p
[
i
−
1
]
[
3
]
+
2
∗
d
p
[
i
−
1
]
[
7
]
;
dp[i][7]=dp[i-1][1]+dp[i-1][3]+2*dp[i-1][7];
dp[i][7]=dp[i−1][1]+dp[i−1][3]+2∗dp[i−1][7];
d
p
[
i
]
[
8
]
=
d
p
[
i
−
1
]
[
2
]
+
d
p
[
i
−
1
]
[
8
]
;
dp[i][8]=dp[i-1][2]+dp[i-1][8];
dp[i][8]=dp[i−1][2]+dp[i−1][8];
d
p
[
i
]
[
9
]
=
d
p
[
i
−
1
]
[
4
]
+
2
∗
d
p
[
i
−
1
]
[
9
]
;
dp[i][9]=dp[i-1][4]+2*dp[i-1][9];
dp[i][9]=dp[i−1][4]+2∗dp[i−1][9];
d
p
[
i
]
[
10
]
=
d
p
[
i
−
1
]
[
5
]
+
2
∗
d
p
[
i
−
1
]
[
10
]
;
dp[i][10]=dp[i-1][5]+2*dp[i-1][10];
dp[i][10]=dp[i−1][5]+2∗dp[i−1][10];
d
p
[
i
]
[
11
]
=
d
p
[
i
−
1
]
[
4
]
+
d
p
[
i
−
1
]
[
8
]
+
2
∗
d
p
[
i
−
1
]
[
11
]
;
dp[i][11]=dp[i-1][4]+dp[i-1][8]+2*dp[i-1][11];
dp[i][11]=dp[i−1][4]+dp[i−1][8]+2∗dp[i−1][11];
d
p
[
i
]
[
12
]
=
d
p
[
i
−
1
]
[
6
]
+
2
∗
d
p
[
i
−
1
]
[
12
]
;
dp[i][12]=dp[i-1][6]+2*dp[i-1][12];
dp[i][12]=dp[i−1][6]+2∗dp[i−1][12];
d
p
[
i
]
[
13
]
=
d
p
[
i
−
1
]
[
9
]
+
d
p
[
i
−
1
]
[
11
]
+
2
∗
d
p
[
i
−
1
]
[
13
]
;
dp[i][13]=dp[i-1][9]+dp[i-1][11]+2*dp[i-1][13];
dp[i][13]=dp[i−1][9]+dp[i−1][11]+2∗dp[i−1][13];
最
终
d
p
[
n
]
[
13
]
即
为
最
终
答
案
。
最终dp[n][13]即为最终答案。
最终dp[n][13]即为最终答案。
本
题
坑
点
:
本题坑点:
本题坑点:
①
:
同
状
态
之
间
的
转
移
一
定
要
注
意
不
能
使
用
本
状
态
不
存
在
的
元
素
①:同状态之间的转移一定要注意不能使用本状态不存在的元素
①:同状态之间的转移一定要注意不能使用本状态不存在的元素
②
:
不
同
状
态
之
间
的
转
移
注
意
先
后
关
系
②:不同状态之间的转移注意先后关系
②:不同状态之间的转移注意先后关系
③
:
注
意
不
能
存
在
前
导
0
的
问
题
③:注意不能存在前导0的问题
③:注意不能存在前导0的问题
代码
/*
***********************************************
Author :biubiubiu
Created Time :2018/10/17/03:46
File Name :F:\CSP\2013-12\4.cpp
************************************************
*/
#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn = 1005;
const int Mod =1000000007;
ll dp[maxn][14];//dp[i][j]表示到达i长度满足j状态的种类数
int main()
{
/*--------------------
一个
1 1 ----1状态
2 2 ----2状态
3 3 ----3状态
两个
02 2 4 ----4状态
03 3 5 ----5状态
12 1 2 6 ----6状态
13 1 3 7 ----7状态
23 2 8 ----8状态
三个
012 4 9 ----9状态
013 5 10 ----10状态
023 4 8 11 ----11状态
123 6 12 ----12状态
四个
0123 9 11 13 ----13状态
*/
dp[1][1]=1,dp[1][2]=1,dp[1][3]=1;
int n;
scanf("%d",&n);
for(int i=2;i<=n;i++)
{
dp[i][1]=dp[i-1][1];
dp[i][2]=dp[i-1][2];
dp[i][3]=dp[i-1][3];
dp[i][4]=dp[i-1][2]+2*dp[i-1][4];
dp[i][5]=dp[i-1][3]+2*dp[i-1][5];
dp[i][6]=dp[i-1][1]+dp[i-1][2]+2*dp[i-1][6];
dp[i][7]=dp[i-1][1]+dp[i-1][3]+2*dp[i-1][7];
dp[i][8]=dp[i-1][2]+dp[i-1][8];
dp[i][9]=dp[i-1][4]+2*dp[i-1][9];
dp[i][10]=dp[i-1][5]+2*dp[i-1][10];
dp[i][11]=dp[i-1][4]+dp[i-1][8]+2*dp[i-1][11];
dp[i][12]=dp[i-1][6]+2*dp[i-1][12];
dp[i][13]=dp[i-1][9]+dp[i-1][11]+2*dp[i-1][13];
for(int j=1;j<=13;j++) dp[i][j]%=Mod;
}
printf("%lld",dp[n][13]);
return 0;
}