http://acm.hdu.edu.cn/showproblem.php?pid=5456

转化成a=b+c,dp[i][a][b][c]表示剩余i木棒,a是否有进位,b是否首尾,c是否首位,注意每次都要memset。

#include<iostream>
#include<cstring>
#include<cstdio>
#define LL long long
using namespace std; int n,m,stick[] = {,,,,,,,,,};
LL dp[][][][]; LL dfs(int sum,int a,int b,int c)
{ if(sum < ) return ;
if(dp[sum][a][b][c] != -) return dp[sum][a][b][c];
if(b && c)
{
if(!a && sum == ) return ;
if(a && sum == stick[]) return ;
}
if(sum == ) return ;
LL& temp = dp[sum][a][b][c];
temp = ;
if(b == && c == )
{
for(int i = ;i <= ;i++)
{
for(int j = ;j <= ;j++)
{
int sub = stick[i]+stick[j]+stick[(i+j+a)%];
temp += dfs(sum-sub,(i+j+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+j+a)/,,);
if(j != ) temp += dfs(sum-sub,(i+j+a)/,,);
if(i != && j != ) temp += dfs(sum-sub,(i+j+a)/,,);
temp %= m;
}
}
}
else if(b == )
{
for(int i = ;i <= ;i++)
{
int sub = stick[i]+stick[(i+a)%];
temp += dfs(sum-sub,(i+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+a)/,,);
temp %= m;
}
}
else if(c == )
{
for(int i = ;i <= ;i++)
{
int sub = stick[i]+stick[(i+a)%];
temp += dfs(sum-sub,(i+a)/,,);
if(i != ) temp += dfs(sum-sub,(i+a)/,,);
temp %= m;
}
}
temp %= m;
return temp;
}
int main()
{
int T;
scanf("%d",&T);
for(int i = ;i <= T;i++)
{
memset(dp,-,sizeof(dp));
scanf("%d%d",&n,&m);
printf("Case #%d: %lld\n",i,dfs(n-,,,));
}
return ;
}

HDU_5456_数位dp的更多相关文章

  1. 【BZOJ1662】[Usaco2006 Nov]Round Numbers 圆环数 数位DP

    [BZOJ1662][Usaco2006 Nov]Round Numbers 圆环数 Description 正如你所知,奶牛们没有手指以至于不能玩"石头剪刀布"来任意地决定例如谁 ...

  2. bzoj1026数位dp

    基础的数位dp 但是ce了一发,(abs难道不是cmath里的吗?改成bits/stdc++.h就过了) #include <bits/stdc++.h> using namespace ...

  3. uva12063数位dp

    辣鸡军训毁我青春!!! 因为在军训,导致很长时间都只能看书yy题目,而不能溜到机房鏼题 于是在猫大的帮助下我发现这道习题是数位dp 然后想起之前讲dp的时候一直在补作业所以没怎么写,然后就试了试 果然 ...

  4. HDU2089 不要62[数位DP]

    不要62 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  5. 数位DP GYM 100827 E Hill Number

    题目链接 题意:判断小于n的数字中,数位从高到低成上升再下降的趋势的数字的个数 分析:简单的数位DP,保存前一位的数字,注意临界点的处理,都是套路. #include <bits/stdc++. ...

  6. 数位dp总结

    由简单到稍微难点. 从网上搜了10到数位dp的题目,有几道还是很难想到的,前几道基本都是模板题,供入门用. 点开即可看题解. hdu3555 Bomb hdu3652 B-number hdu2089 ...

  7. 数位DP入门

    HDU 2089 不要62 DESC: 问l, r范围内的没有4和相邻62的数有多少个. #include <stdio.h> #include <string.h> #inc ...

  8. 数位DP之奥义

    恩是的没错数位DP的奥义就是一个简练的dfs模板 int dfs(int position, int condition, bool boundary) { ) return (condition ? ...

  9. 浅谈数位DP

    在了解数位dp之前,先来看一个问题: 例1.求a~b中不包含49的数的个数. 0 < a.b < 2*10^9 注意到n的数据范围非常大,暴力求解是不可能的,考虑dp,如果直接记录下数字, ...

随机推荐

  1. swoole通往大神之路——swoole任务中心说明及进程任务架构搭建

    Swoole多任务处理中心 如果你还不会用swoole就out了,swoole通往大神之路——swoole任务中心说明及进程任务架构搭建 教学视频: www.bilibili.com/video/av ...

  2. Windows 7 + Tiny Linux 4.19 + XFS + Vmware Workstation 15 (PRO) 下篇dockerの奥义

    美好的事物总是来自不易,而我是一个docker新手 从以上开场,请各位follow me站在一个初学者的角度,一步一步用最简单的视角审视docker和它的真实存在 上篇预告:Windows 7 + T ...

  3. Sample Code之Take a screenshot of a SceneView

    周末事情太多了,以后就工作日发布随笔吧.周末的话,看心情,也许也会发~ 今天的实例代码解析是Take a screenshot of a SceneView,也就是获取快照,话不多说,进入正题. 首先 ...

  4. 字符串String类常见算法题

    1.将一个字符串进行反转.将字符串中指定部分进行反转. public class StringDemo { //方式一:转换为char[] public String reverse(String s ...

  5. CF825G Tree Queries

    [题意] 一棵树有 n个节点,初始均为白色,有两种操作: 1. 1 x 代表把结点 x 设置为黑色 2. 2 x 代表查询 x 到树上任意一个黑色结点的简单路径上的编号最小的结点的编号 输入 t 和 ...

  6. Redis 通配符批量删除key

    问题: 线上有部分的redis key需要清理. 一. 由于Keys模糊匹配,请大家在实际运用的时候忽略掉.因为Keys会引发Redis锁,并且增加Redis的CPU占用,情况是很恶劣的, 官网说明如 ...

  7. Spring学习记录2——简单了解Spring容器工作机制

    简单的了解Spring容器内部工作机制 Spring的AbstractApplicationContext是ApplicationContext的抽象实现类,该抽象类的refresh()方法定义了Sp ...

  8. ELK学习实验018:filebeat收集docker日志

    Filebeat收集Docker日志 1 安装docker [root@node4 ~]# yum install -y yum-utils device-mapper-persistent-data ...

  9. 公文流转系统v0.1

    河北金力集团公文流转系统 1.项目需求: 河北金力集团是我省机械加工的龙头企业,主要从事矿山机械制造及各种机械零部件加工.企业有3个厂区,主厂区位于省高新技术开发区,3个分厂分别在保定.邢台和唐山.为 ...

  10. PHP——foreach

    一.foreach 在PHP中foreach循环语句,常用于遍历数组,一般有两种使用方式:不取下标.取下标 (一)只取值,不取下标 <?php foreach (数组 as 值){ //执行的任 ...