ccf模拟题 有趣的数
2015-03-28 10:45
197 查看
</pre><pre name="code" class="java">import java.util.Scanner; public class FunnyNumber { /** * 1. 它的数字只包含0, 1, 2, 3,且这四个数字都出现过至少一次。 2. 所有的0都出现在所有的1之前,而所有的2都出现在所有的3之前。 3. 最高位数字不为0。 */ public static void main(String[] args) { /* * 定义状态数组status[n + 1][6],status[i][j]表示填到第i位数(从左至右填)时处于第j个状态,状态定义如下: 0 -- 0 1 (2) 3 1 -- (0) 1 (2) 3 2 -- 0 1 (2) (3) 3 -- (0) (1) (2) 3 4 -- (0) 1 (2) (3) 5 -- (0) (1) (2) (3) 括号中的数表示这个数已经出现过。可以验证,数字2必须首先出现。 以上6个状态是所有的可达状态,其它状态都不合法。 */ Scanner s = new Scanner(System.in); int n = s.nextInt(); long mod = 1000000007; long status[][] = new long[n+1][6]; for(int i = 0;i<6;i++){ status[0][i]=0;//不看第0行 } for(int i = 1;i<n+1;i++){ status[i][0]=1;//第i个数只出现2的情况只有一种 //第i个数出现0和2的情况:前一个数出现2时只能写0,前一个数出现0和2时0、2都能写 status[i][1]=(status[i-1][0]+status[i-1][1]*2)%mod; //第i个数出现2和3的情况:前一个数出现2时只能写3,前一个数出现2或3时,因为所有2在3前面,也只能写3 status[i][2]=(status[i-1][0]+status[i-1][2])%mod; //第i个数出现0、1和2的情况:前一个数出现0、2时只能写1,前一个数出现0、1、2时写1或2 status[i][3]=(status[i-1][1]+status[i-1][3]*2)%mod; //第i个数出现0、2和3的情况:前一个数出现0、2时写3,前一个数出现2、3时写0,前一个数出现0、2、3写0或3 status[i][4]=(status[i-1][1]+status[i-1][2]+status[i-1][4]*2)%mod; //第i个数出现0、1、2和3的情况:前一个数出现0、1、2时写3,前一个数出现0、2、3时写1, //前一个数出现0、1、2、3时写1或3 status[i][5]=(status[i-1][3]+status[i-1][4]+status[i-1][5]*2)%mod; } System.out.println(status [5]); } }
相关文章推荐
- 动态规划第二弹!CCF模拟题 有趣的数(数位DP)
- 有趣的数-CCF模拟题4
- CCF 模拟题 有趣的数 (数位DP)
- CCF模拟题 有趣的数
- CCF模拟题—— 有趣的数详解
- CCF模拟题4-有趣的数 未知能否ac
- CCF模拟题——有趣的数详解
- CCF模拟题4-有趣的数
- CCF CSP 有趣的数 动态规划
- CCF软件能力认证考试模拟题 ISBN号码
- 【CCF】有趣的数
- ccf csp 201312-4 有趣的数
- 动态规划——有趣的数(ccf)
- ccf模拟题 201709-4 通信网络(缩点,dfs)
- (CCF 201312-4)有趣的数 [DP] 最详细解答
- ccf 201312-4 有趣的数(动态规划)
- CCF2013-4有趣的数
- ccf 有趣的数
- ccf 有趣的数 DP
- ccf-有趣的数