个人博客链接:https://blog.nuoyanli.com/2020/04/02/fuz2204/

原题链接

http://acm.fzu.edu.cn/problem.php?pid=2204

题意

给出nnn个小球,每个小球只能涂黑色或者是白色,规定777个连续的不能是同种颜色,问有多少种涂色方法?答案取模201520152015

思路

我们将问题变成,求用0,10,10,1组成长度为nnn的环,环中不能超过有连续777个111和000的方案数,答案mod2015mod2015mod2015。

首先,这是环形dpdpdp是毋容置疑的,我们先抛开环形这个问题考虑线形的dpdpdp:

  • dp[i][j]:dp[i][j]:dp[i][j]:表示到第iii个位置,iii这个位置种类为jjj的组成的方案数,又因为000和111的情况是一样的,所以任取一种做dp[i][j]dp[i][j]dp[i][j]答案∗2*2∗2即可。

  • 状态转移

for (int i = 1; i <= n; i++) {dp[i][0] = 1;for (int j = 0; j < 2; j++) {for (int k = 1; k < min(i, 7); k++) {dp[i][j] = (dp[i][j] + dp[i - k][!j]) % mod;}}
}

现在回归到环形这个限制,对于上面推的状态显然是具有后效性的,涉及到重复计算,拆环我们可以考虑枚举起点的状态:

  • 由于先前说的111和000的状态是对应的,我们以000为例枚举起点的状态

    1

    10
    100
    1000
    10000
    100000
    1000000

  • 我们之后的所有状态都可以由上面这些两两拼接。

  • 最后我们计算结果的时候,如果结尾和开头枚举的物品种类相同,要保证答案合法那么只需要保证结尾连续的个数+开头连续的个数≤6\leq 6≤6即可。

与线形的相比,状态转移不变,就多枚举了开始位置和状态而已。

参考代码

#include <algorithm>
#include <cmath>
#include <cstring>
#include <iostream>//#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false), cin.tie(0)
#define endl '\n'
#define kB kush_back
#define FI first
#define SE second
//#define in
#define RI register
#define m_k(a, b) make_kair(a, b)
#define debug(a) cout << "---" << a << "---" << endl
#define debug_(a, b) cout << a << "---" << b << endl
const double pi = acos(-1.0);
const double eps = 1e-9;
typedef long long LL;
const int N = 1e5 + 10;
const int M = 1e3 + 10;
const int mod = 2015;
const LL inf = 0x3f3f3f3f;
const double f = 2.32349;
LL dp[N][2], n, t;
void solve() {IOS;int k = 0;cin >> t;while (t--) {cin >> n;cout << "Case #" << ++k << ": ";LL ans;if (n <= 6) {ans = 1;for (int i = 1; i <= n; i++) {ans = (ans + ans) % mod;}} else {ans = 0;for (int st = 1; st < 7; st++) {memset(dp, 0, sizeof(dp));dp[st][0] = 1;for (int i = st + 1; i <= n; i++) {for (int j = 0; j < 2; j++) {if (i == n && j == 0) {for (int k = 1; k < min(i, 7 - st); k++) {dp[i][j] = (dp[i][j] + dp[i - k][!j]) % mod;}} else {for (int k = 1; k < min(i, 7); k++) {dp[i][j] = (dp[i][j] + dp[i - k][!j]) % mod;}}}}ans = (ans + dp[n][0] + dp[n][1]) % mod;}ans = (ans * 2) % mod;}cout << ans << endl;}
}
signed main() {#ifdef infreopen("in.txt", "r", stdin);freopen("out.txt", "w", stdout);
#endifsolve();return 0;
}

FUZ-2204-7环形dp相关推荐

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

    1085 数字游戏  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题目描述 Description 丁丁最近沉迷于一个数字游戏之中.这个游戏看似简单,但丁丁在 ...

  2. 【环形dp】poj 2228 Naptime

    题目链接 题意:一天分为N个时间片(可顺到下一天->环形),选择其中B个睡觉.选择第i个时间片能获得u_i点值,但是选择的一个区间内的第一个时间片用来入睡(没睡着),无法获得u_i值.问最大能获 ...

  3. P3575-[POI2014]DOO-Around the world【环形dp】

    正题 题目大意:https://www.luogu.org/problemnew/show/P3575 题目大意 一个环,上面有若干个点,若干个询问xxx. 表示上一个降落点和下一个降落点距离不能超过 ...

  4. poj 2228 环形DP

    题意: 一天有n个时间,有一只牛希望一天可以休息睡小时.如果牛在第i时刻已经熟睡,他可以得到ui的休息.但是如果他在i时刚刚入睡,他不能得到休息.牛可以从前一天晚上睡到第二天.睡觉时间也不一定连续.问 ...

  5. Vijos1451圆环取数[环形DP|区间DP]

    背景 小K攒足了路费来到了教主所在的宫殿门前,但是当小K要进去的时候,却发现了要与教主守护者进行一个特殊的游戏,只有取到了最大值才能进去Orz教主-- 描述 守护者拿出被划分为n个格子的一个圆环,每个 ...

  6. 51nod 1050 循环数组最大子段和【环形DP/最大子段和/正难则反】

    1050 循环数组最大子段和 基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题  收藏  关注 N个整数组成的循环序列a[1],a[2],a[3],-,a[n],求该 ...

  7. poj2228Naptime——环形DP

    题目:http://poj.org/problem?id=2228 dp[i][j][0/1]表示前i小时中第j小时睡(1)或不睡(0)的最优值: 注意第一个小时,若睡则对最终取结果有要求,即第n个小 ...

  8. 传球游戏-----环形DP

    题目链接 思路:f[i][j]表示传了i次,且第i次在第j个小朋友手里的方案数 每个状态只能由左右两个小朋友转移而来 顾状态转移方程为:f[i][j]=f[i-1][(j-1+n)%n]+f[i-1] ...

  9. AC自动机 + 概率dp + 高斯消元 --- HDU 5955 or 2016年沈阳icpc H [AC自动机 + 概率dp + 高斯消元]详解

    题目链接 题目大意: 就是有NNN个人,每个人都会猜一个长度为LLL的只包含{1,2,3,4,5,6}\{1,2,3,4,5,6\}{1,2,3,4,5,6}的序列,现在裁判开始投掷骰子,并且把每次的 ...

最新文章

  1. centos升级python_CentOS 升级Python3
  2. Google App Engine(GAE)入门教程翻译
  3. 全球及中国塑料制品行业发展形势及产量需求前景研究报告2021版
  4. 从动力学角度看优化算法:自适应学习率算法
  5. python从多层循环嵌套中退出_python中退出多层循环的方法
  6. 最长公共子序列算法 java_转【算法之动态规划(三)】动态规划算法之:最长公共子序列 最长公共子串(LCS)字符串相似度算法...
  7. vs2015web开发_2015年最佳10+ Web开发工具和服务
  8. c# mysql varbinary_数据库中用varbinary存储二进制数据
  9. 微型计算机原理与应用彭楚武,微型计算机原理及其应用
  10. 面试要求 熟悉linux系统,Linux面试中最常问的10个问题总结
  11. 母亲节,表格交给我们,你早点回家
  12. 《Python编程:从入门到实践》学习笔记——第5章 if语句
  13. ArcGIS水文分析实战教程(4)地形预处理
  14. 配置nginx.conf证书,实现http跳转htpps(80-->443)
  15. android 语音识别文字
  16. unet医学肺部ct图分割简单记录
  17. 对于越野车来说 带大梁,前后硬桥!
  18. am335x linux内核烧写_am335x文件系统烧写问题
  19. GuLi商城-在线打开pdm文件
  20. 线性代数-向量,矩阵,线性变换

热门文章

  1. 语义分割的常用指标详解
  2. 开发基于 Google Map 的 Android 应用
  3. VCS+Verdi 安装及破解过程(Ubuntu)【1】
  4. 全国职业院校技能大赛(中职组)网络安全竞赛试题—解析
  5. 【总线】什么是并行传输?什么是串行传输?什么是异步传输?什么是同步传输?什么是等时传输?
  6. 盗梦空间科普札记之一:梦里乾坤嵌套深,醒来可知在哪层?
  7. 一个屌丝程序员的青春(六七)
  8. keevi源地址_贴吧源为什么一直添加不了?顺便分享好用的源添加贴吧源,一直提...
  9. 信息驾驶舱(管理驾驶舱)
  10. 2022-06-25 网工进阶(十一)IS-IS-三大表(邻居表、路由表、链路状态数据库表)、LSP、CSNP、PSNP、LSP的同步过程