简单dp ---HDU3485 Count 101

题目大意:让求长度为n的0 和 1 构成的串中不包含101子串的个数有多少。

这个题当时想了好久,以为是一个规律题,一直在推规律,最后还是wa了,上网一看原来是dp问题, 不过确实递推式挺巧妙的。

递推式dp[i] = 2 * dp[i - 1] - dp[i - 2] + dp[i - 3];

现在就来推一下这个式子,首先dp[i]就表示当长度为 i 的 的时候满足条件(就是串中不含101)的个数,dp[i] = 2 * dp[i - 1] - {最后两位是10的个数},其中2 * dp[i-1]就表示总数,最后两位是10的个数就等于 最后一位是0的个数减去倒数第二位是0的个数, 还有一个问题就是最后一位是0怎么求, 最后一个是零的个数就是dp[i-1], 因为当前位的总个数等于前一位乘2, 因为是只有0和1两种状态,所以是0的个数就是前一位的数所以 {最后两位是10的个数} = dp[i - 2] - dp[i - 3]; 所以这个式子最后就是dp[i] = 2 * dp[i - 1] - dp[i - 2] + dp[i - 3];

代码如下:

 1 #include<iostream>
 2 #include <stdio.h>
 3 using namespace std;
 4 int dp[10010];
 5 int main()
 6 {
 7     dp[0] = 0; dp[1] = 2; dp[2] = 4; dp[3] = 7;
 8     for (int i = 4; i < 10010; i++)
 9         dp[i] = (2 * dp[i - 1] -  dp[i - 2] +  dp[i - 3]) % 9997 ;
10     int n;
11     while (~scanf("%d", &n) && n != -1)
12     {
13         printf("%d\n", dp[n]);
14     }
15     return 0;
16 }
时间: 2024-11-26 05:19:51

简单dp ---HDU3485 Count 101的相关文章

1363: Count 101 (经典数位dp)

1363: Count 101 Submit Page    Summary    Time Limit: 1 Sec     Memory Limit: 128 Mb     Submitted: 393     Solved: 154 Description You know YaoYao is fond of his chains. He has a lot of chains and each chain has n diamonds on it. There are two kinds

POJ 3250 Bad Hair Day 简单DP 好题

Description Some of Farmer John's N cows (1 ≤ N ≤ 80,000) are having a bad hair day! Since each cow is self-conscious about her messy hairstyle, FJ wants to count the number of other cows that can see the top of other cows' heads. Each cow i has a sp

(hdu step 3.2.8)命运(简单DP:求从左上角走到右下角的最大值)

题目: 命运 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1247 Accepted Submission(s): 530   Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了!可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,

Dollars(简单DP)

J - Dollars Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatus Description  Dollars  New Zealand currency consists of $100, $50, $20, $10, and $5 notes and $2, $1, 50c, 20c, 10c and 5c coins. Write a program that will d

HDU 3485 Count 101

Count 101 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 1114    Accepted Submission(s): 568 Problem Description You know YaoYao is fond of his chains. He has a lot of chains and each chain has

hdu1501 Zipper[简单DP]

题目地址 hdu1501 题干 代码和解释 最优子结构分析:设这三个字符串分别为a.b.c,如果a.b可以组成c,那么c的最后一个字母必定来自a或者b的最后一个字母.c去除最后一位,就变成由a-1和b或者a和b-1构成c-1的问题. 状态转移方程:DP[i][j]表示c中i个字符来自于a,j个字符来自于b,即由a的前i个字符和b的前j个字符组成c的前i+j个字符.DP[i][j]为1则真,为0则假. /*给3个字符串,让你判断能不能组合前两个字符串来获得第3个字符串.前两个字符串可以被任意混合,

hdu1207 汉诺塔II 简单dp

本文出自:http://blog.csdn.net/svitter 题意:汉诺塔,多了一根柱子,问你寻找最快的移动次数. dp [ n ] = dp [ n - j ] * 2 + pow( 2, j ) - 1; 就是把j个汉诺塔移到一根上dp[ n - j ],然后就是普通的汉诺塔问题,即2^n - 1次移动, 然后把剩下的移动过去dp [ n - j ]. 注意pow(2, j )可能超出long long int范围.写二的次方的时候也可用移位算法. #include <iostream

POJ1088:滑雪(简单dp)

题目链接:  http://poj.org/problem?id=1088 题目要求: 一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小.求可以滑落的最长长度. 题目解析: 首先要先排一下序,因为只能高度递减才能滑行.之后就很简单了,就是简单DP. 即:要求的滑坡是一条节点递减并依次相邻的最长路径,可以先根据高度将所有的点进行排序,在i点的时候,遍历0~i-1个点(升序排序,i前面的点的高度一定小于等于i),取相邻点间的大的路径长度 代码如下: #include <iostream

hdu 1087 简单dp

思路和2391一样的.. <span style="font-size:24px;">#include<stdio.h> #include<string.h> #include<iostream> #include<algorithm> using namespace std; const int inf=(0x7f7f7f7f); int main() { int a; int s[10005]; int w[10005];