HDU5787 K-wolf Number 数位dp
分析:赛场上也知道是裸的数位dp,但是无奈刷数位dp题刷的太少了,并不能写出来
一点感想:赛后补题,看了题解的map记录状态,一脸蒙逼,也是非常的不爽,然后想看别人写的,不是递归就是写的比较乱
而且我只刷过最入门的数位dp,例如不要62之类,伤不起啊
然后无奈之下,开了仿照别人题解开了dp[20][10][10][10][10]的数组(别人一般还写个上下限之类的代码,并不能看懂)
这样的数组就可以处理k等于5的情况了,数组第一维代表最高位,后四维代表从当前开始的4个数分别是多少
然后就可以dp[i][...]=dp[i-1][...],当然要符合条件
然后我就是开始仿照“不要62"的那种裸数位dp的方式写这道题,各种统计啊,各种判断矛盾啊,最后辛苦AC
代码比较丑,因为写的比较直接,对于那种只会基础数位dp的人可能有帮助吧,好在最后效率还不错93ms(比某些递归还是快的)
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e3+;
const int INF=0x3f3f3f3f;
const int mod = 1e9+;
const LL ten=;
LL dp[][][][][],sum[][],L,R;
int k;
void up(int cur,int a,int b,int c,int d)
{
if(cur<=)
{
dp[cur][a][b][c][d]=;
sum[cur][a]+=dp[cur][a][b][c][d];
return;
}
for(int i=; i<; ++i)
{
if(i==d||(k>=&&i==c)||(k>=&&i==b)||(k>=&&i==a))continue;
dp[cur][a][b][c][d]+=dp[cur-][b][c][d][i];
}
sum[cur][a]+=dp[cur][a][b][c][d];
}
int bit[],cnt;
LL solve()
{
LL ret=;
for(int i=; i<cnt; ++i)
for(int j=; j<=; ++j)ret+=sum[i][j];
for(int i=cnt; i; --i)
{
int j=(i==cnt)?:;
for(; j<bit[i]; ++j)
{
int a=j;
bool f=false;
for(int p=min(i+k-,cnt); p>i; --p)if(a==bit[p])
{
f=true;
break;
}
if(f)continue;
if(i==)
{
ret+=dp[][a][][][];
continue;
}
for(int b=; b<; ++b)
{
if(b==a)continue;
if(k>=&&i+<=cnt&&b==bit[i+])continue;
if(k>=&&i+<=cnt&&b==bit[i+])continue;
if(k==&&i+<=cnt&&b==bit[i+])continue;
if(i==)
{
ret+=dp[][a][b][][];
continue;
}
for(int c=; c<; ++c)
{
if(c==b)continue;
if(k>=&&c==a)continue;
if(k>=&&i+<=cnt&&c==bit[i+])continue;
if(k==&&i+<=cnt&&c==bit[i+])continue;
if(i==)
{
ret+=dp[][a][b][c][];
continue;
}
for(int d=; d<; ++d)
{
if(!dp[i][a][b][c][d])continue;
if(k==&&i+<=cnt&&d==bit[i+])continue;
ret+=dp[i][a][b][c][d];
}
}
}
}
bool flag=false;
for(int p=min(i+k-,cnt); p>i; --p)if(bit[p]==bit[i])
{
flag=true;
break;
}
if(flag)break;
}
return ret;
}
int main()
{
while(~scanf("%I64d%I64d%d",&L,&R,&k))
{
memset(dp,,sizeof(dp));
memset(sum,,sizeof(sum));
++R;
cnt=;
while(R)bit[++cnt]=R%ten,R/=ten;
for(int i=; i<=cnt; ++i)
{
for(int a=; a<; ++a)
{
if(i==)
{
up(,a,,,);
continue;
}
for(int b=; b<; ++b)
{
if(b==a)continue;
if(i==)
{
up(,a,b,,);
continue;
}
for(int c=; c<; ++c)
{
if(c==b||(k>=&&c==a))continue;
if(i==)
{
up(,a,b,c,);
continue;
}
for(int d=; d<; ++d)
{
if(d==c||(k>=&&d==b)||(k>=&&d==a))continue;
up(i,a,b,c,d);
}
}
}
}
}
LL tmp=solve();
cnt=;
while(L)bit[++cnt]=L%ten,L/=ten;
printf("%I64d\n",tmp-solve());
}
return ;
}
HDU5787 K-wolf Number 数位dp的更多相关文章
- 多校5 HDU5787 K-wolf Number 数位DP
// 多校5 HDU5787 K-wolf Number 数位DP // dp[pos][a][b][c][d][f] 当前在pos,前四个数分别是a b c d // f 用作标记,当现在枚举的数小 ...
- codeforces Hill Number 数位dp
http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits: 5000 MS Memory Limits: ...
- HDU 5787 K-wolf Number 数位DP
K-wolf Number Problem Description Alice thinks an integer x is a K-wolf number, if every K adjacen ...
- HDU 3709 Balanced Number (数位DP)
Balanced Number Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65535/65535 K (Java/Others) ...
- beautiful number 数位DP codeforces 55D
题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...
- hdu 5898 odd-even number 数位DP
传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...
- Fzu2109 Mountain Number 数位dp
Accept: 189 Submit: 461Time Limit: 1000 mSec Memory Limit : 32768 KB Problem Description One ...
- hdu_3565_Bi-peak Number(数位DP)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3565 题意:给你一个区间,让你找这个区间内有两个山峰的数的最大和,什么是两个山峰,比如121121 ...
- HDU 5179 beautiful number 数位dp
题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...
随机推荐
- hdu 2582 f(n) 数学
打表找规律: 当n为质数是,GCD(n)=n; 当n为质数k的q次方时,GCD(n)=k; 其他情况,GCD(n)=1. 代码如下: #include<iostream> #include ...
- JDK与JRE
dos命令行中常见的命令: 1.dir:列出当前目录下的文件以及文件夹 2.md:创建目录(即文件夹) |-----C:\>md kkk(在C盘下创建了一个名为kkk的文件夹) 3.rd:删除目 ...
- 【零基础学习iOS开发】【02-C语言】05-进制
上一讲简单介绍了常量和变量,这讲补充一点计算机的基础知识---进制. 我们先来看看平时是如何表示一个整数的,最常见的肯定是用阿拉伯数字表示,比如“十二”,我们可以用12来表示,其实这种表示方式是基于一 ...
- Project Euler 82:Path sum: three ways 路径和:3个方向
Path sum: three ways NOTE: This problem is a more challenging version of Problem 81. The minimal pat ...
- [SharePoint 2013 入门教程 2 ] 创建WEB应用程序,网站集,网站
SharePoint 2013 的 Hello World 由大到小 创建WEB应用程序(老母),网站集(儿子),网站(孙子) 直接确定,其余都默认 填入标题,选好模板.网站集 儿子就有了. 点击页 ...
- HTML5入门7---"session的会话缓存"和"localStorage的cookie"缓存数据
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- GitHub最全的前端资源汇总仓库(包括前端学习、开发资源、求职面试等)
在GitHub上收集的最全的前端资源汇总(包括前端学习.前端开发资源.前端求职面试等) 个人结合github上各位大神分享的资源进行了简单的汇总整理,每一个条目下面都有丰富的资料,是前端学习.工作的好 ...
- QT5删除隐藏目录+隐藏文件(使用Process::start函数调用系统命令,且等待到结束)
1.功能需求 删除一个目录(包括目录本身),同时删除该目录中所有文件及目录(含隐藏的) 2.遇到的问题 qt5中已经有了递归删除目录的函数--->bool QDir::removeRecursi ...
- 未能加载文件或程序集“Interop.jmail”或它的某一个依赖项
未能加载文件或程序集“Interop.jmail”或它的某一个依赖项.试图加载格式不正确的程序. 说明: 执行当前 Web 请求期间,出现未经处理的异常.请检查堆栈跟踪信息,以了解有关该错误以及代码中 ...
- C# progressbar 用法
http://blog.chinaunix.net/uid-9236609-id-3069624.html progressBar1.Maximum = 100;//设置最大长度值 ...