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 ...
随机推荐
- TVM 下载监控
iftop -n -i em1 -F 218.26.188.220/32 到10.10.81.23上用上面的语句看山西的流量. 到/opt/data/log/下看日志 到/opt/data/tvmca ...
- 黑马程序员-- .net基础加强8之委托,事件,程序集
---------------------- ASP.Net+Android+IOS开发..Net培训.期待与您交流! ---------------------- 一.委托 ============ ...
- 欧拉工程第66题:Diophantine equation
题目链接 脑补知识:佩尔方差 上面说的貌似很明白,最小的i,对应最小的解 然而我理解成,一个循环的解了,然后就是搞不对,后来,仔细看+手工推导发现了问题.i从0开始变量,知道第一个满足等式的解就是最小 ...
- OPenGL中三维图形的矩阵变换
对于二维的图形开发,拿简单的图片显示来说,我们主要的目的:就是在一块显示buffer中,不停的把每个像素进行着色,然后就可以绘制出来了.为了速度,很多其他的加速方法,但原理基本上就是这样了. 很直观, ...
- java @param参数注解
注解,@param是参数的解释.如/***@param s 这里表示对s的文字说明,描述 */ public void aa(String s){}一般java中@表示注解,解释一个方法,类,属性的作 ...
- Java学习笔记之:Java封装
一.引言 在面向对象程式设计方法中,封装(英语:Encapsulation)是指,一种将抽象性函式接口的实作细节部份包装.隐藏起来的方法. 封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定 ...
- WP布局之Pivot和Panorama
一.Pivot控件(枢轴控件) Pivot主要用于管理应用中的视图或者页面,此控件在WP中几乎处处可见,不管是短信的左右滑动,还是QQ的左右滑动都是此控件的功劳. 就是图片中的控件,是不是很熟悉呢. ...
- HDU 4686 Arc of Dream(矩阵)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 题意: 思路: #include <iostream>#include <cs ...
- Java 包装类 自动装箱和拆箱
包装类(Wrapper Class) 包装类是针对于原生数据类型的包装. 因为有8个原生数据类型,所以对应有8个包装类. 所有的包装类(8个)都位于java.lang下. Java中的8个包装类分别是 ...
- iOS开发:视图生命周期
iOS应用的视图状态分为以下几种 在viewcontroller的父类UIViewController中可以看到如下代码,通过重写不同的方法对操作视图渲染. @available(iOS 2.0, * ...