FZU - 2204 简单环形dp

FZU - 2204 简单环形dp

题目链接

n个有标号的球围成一个圈。每个球有两种颜色可以选择黑或白染色。问有多少种方案使得没有出现连续白球7个或连续黑球7个。

输入

第一行有多组数据。第一行T表示组数。(T <= 20)

每组包含n,表示球的个数。(1 <= n <= 100000)

输出

每组先输出 "Case #x: " (其中x为当前组数) 该行接下来输出方案数。方案数mod 2015。

样例

 2 7 1
Case #1: 126

Case #2: 2

思路

链接??

代码

#include<iostream>
using namespace std;

const int Len = 100005;
#define mod 2015
int dp[Len][7][2];              //dp[i][j][k], 表示在到i个位置的时候有j个连续的k(k == 0 || k == 1)

int main()
{
    /* freopen("A.txt","r",stdin); */
    int t;
    scanf("%d", &t);
    int Case = 1;
    while(t --)
    {
        int n;
        scanf("%d", &n);
        if(n <= 6)
        {
            printf("Case #%d: %d\n", Case ++, 1 << n);
        }
        else
        {
            int sum = 0;
            for(int i = 1; i <= 6; i ++)
            {
                memset(dp, 0, sizeof(dp));
                dp[i + 1][i][1] = 1;            //我们默认在最前边放置的是0,在这个0位置之后我们假设 1~6 个连续的1,对于这1~6的每一种情况我们 进行一一讨论
                for(int j = i + 2; j <= n; j ++)
                {
                    //接下来讨论当前的这个第一个位置有几个连续的0或者1,进行讨论
                    //先讨论当前位置有一个连续0或1的情况
                    dp[j][1][0] = (dp[j - 1][1][1] + dp[j - 1][2][1] + dp[j - 1][3][1] + dp[j - 1][4][1] + dp[j - 1][5][1] + dp[j - 1][6][1]) % mod;
                    dp[j][1][1] = (dp[j - 1][1][0] + dp[j - 1][2][0] + dp[j - 1][3][0] + dp[j - 1][4][0] + dp[j - 1][5][0] + dp[j - 1][6][0]) % mod;
                    for(int k = 2; k <= 6; k ++)
                    {
                        dp[j][k][0] = dp[j - 1][k - 1][0] % mod;
                        dp[j][k][1] = dp[j - 1][k - 1][1] % mod;
                    }
                }

                //对于每一种以最开头为0的情况的方案数
                for(int i = 1; i <= 5; i ++)
                    sum = sum % mod + (dp[n][i][0] + dp[n][i][1]) % mod;
                sum = sum % mod + dp[n][6][1] % mod;
            }
            printf("Case #%d: %d\n", Case ++, 2 * sum % mod);
        }
    }

    return 0;
}

原文地址:https://www.cnblogs.com/lql-nyist/p/12630675.html

时间: 2024-08-28 15:19:45

FZU - 2204 简单环形dp的相关文章

fzu 2204 7 dp

题目链接: fzu 2204 7 题目描述: 给出n个小球,每个小球只能涂黑色或者是白色,七个连续的不能是同种颜色,问有多少种涂色方法? 解题思路: 刚开始没有考虑到是环形的,WA的风生水起,怪我咯!怪我咯!最后看到是环形的,然后就考虑去除环的影响. 先设定起始位置小球颜色为0(白色), (1-->黑色),考虑可知起始位置小球颜色为1的方案数目与设定方案相同,所以算出任意一种,乘上2就是答案. dp[a][x][y] 代表 a-->前a个小球颜色都为0, x-->第i位置小球的颜色, y

codevs1085数字游戏(环形DP+划分DP )

1085 数字游戏 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在研究了许多天之后却发觉原来在简单的规则下想要赢得这个游戏并不那么容易.游戏是这样的,在你面前有一圈整数(一共n个),你要按顺序将其分为m个部分,各部分内的数字相加,相加所得的m个结果对10取模后再相乘,最终得到一个数k.游戏的要求是使你所得的k最大或者最小. 例如,对于下面这圈数字(n=4,m=2): 2

csu 2014 summer training day 3 简单树形dp

FZU 2157 题意:树上的节点可以打上0或1的标记,树的权值由两部分呢组成,点权和边权,有00.01.10.11四种组合的边权, 问最小权值和.以1节点为树根 分析:dp[x][0]表示x标记0后的最小的权值,dp[x][1]同理 那么每次可以计算dp[x][0],dp[x][1]: 例如dp[x][1]=min(dp[son][0]+lab[0][1]+val[1],dp[son][1]+bal[1][1]+val[1]); 具体看代码. 用bfs写的分层,深搜代码更简洁 1 #inclu

简单Dp----最长公共子序列,DAG最长路,简单区间DP等

/* uva 111 * 题意: * 顺序有变化的最长公共子序列: * 模板: */ #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; int a[100]; int mu[100]; int Dp[100][100]; int main() { int n,x; scanf("%d", &n

POJ 3071 Football(简单 概率DP)

Football 原文链接:http://blog.csdn.net/xuechelingxiao/article/details/38520105 大意:2^n 个球队进行单场淘汰赛,每两只球队之间比赛会有胜负的概率,问最后谁夺冠的概率最大. 思路:简单的概率DP问题,主要是怎么处理哪两个球队比赛的问题. DP方程为 dp[i][j] = ∑(dp[i-1][j]*dp[i-1][k]*p[j][k]); //dp[i][j]表示第 i 轮的时候,第 j 支队伍赢的概率.. 对于其中位运算,可

简单的dp hdu 数塔(水题)

数塔 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 21314    Accepted Submission(s): 12808 Problem Description 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的: 有如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少

hdu 1520Anniversary party(简单树形dp)

Anniversary party Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 4310    Accepted Submission(s): 1976 Problem Description There is going to be a party to celebrate the 80-th Anniversary of the

HDU Tickets(简单的dp递推)

Tickets Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 972    Accepted Submission(s): 495 Problem Description Jesus, what a great movie! Thousands of people are rushing to the cinema. However,

Aeroplane chess(简单概率dp)

Hzz loves aeroplane chess very much. The chess map contains N+1 grids labeled from 0 to N. Hzz starts at grid 0. For each step he throws a dice(a dice have six faces with equal probability to face up and the numbers on the faces are 1,2,3,4,5,6). Whe