分析:赛场上也知道是裸的数位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的更多相关文章

  1. 多校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 用作标记,当现在枚举的数小 ...

  2. codeforces Hill Number 数位dp

    http://www.codeforces.com/gym/100827/attachments Hill Number Time Limits:  5000 MS   Memory Limits: ...

  3. 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 ...

  4. HDU 3709 Balanced Number (数位DP)

    Balanced Number Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  5. beautiful number 数位DP codeforces 55D

    题目链接: http://codeforces.com/problemset/problem/55/D 数位DP 题目描述: 一个数能被它每位上的数字整除(0除外),那么它就是beautiful nu ...

  6. hdu 5898 odd-even number 数位DP

    传送门:hdu 5898 odd-even number 思路:数位DP,套着数位DP的模板搞一发就可以了不过要注意前导0的处理,dp[pos][pre][status][ze] pos:当前处理的位 ...

  7. Fzu2109 Mountain Number 数位dp

    Accept: 189    Submit: 461Time Limit: 1000 mSec    Memory Limit : 32768 KB  Problem Description One ...

  8. hdu_3565_Bi-peak Number(数位DP)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3565 题意:给你一个区间,让你找这个区间内有两个山峰的数的最大和,什么是两个山峰,比如121121   ...

  9. HDU 5179 beautiful number 数位dp

    题目链接: hdu: http://acm.hdu.edu.cn/showproblem.php?pid=5179 bc(中文): http://bestcoder.hdu.edu.cn/contes ...

随机推荐

  1. Java 连接SQLite数据库

    下载jar包: http://www.sqlite.com.cn/Upfiles/source/sqlitejdbc-v033-nested.tgz public class TestSQLite { ...

  2. sql多表删除

    如果t_message表和t_user_has_message表通过字段id和messageId相关联, 并且打算删除这两张表拥有共同关联id的数据,可以使用SQL语句: DELETE m, uhm ...

  3. DIV+CSS列表式布局(同意图片的应用)

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. 小米2s 降到1299

    关于这个价格,网上叫声一片,尤其是几天前刚买了小米2s的,恨死了雷布斯…… 以下是来自百度贴吧的帖子: [02-27 米粉杂谈]我来说个关于价格的事实吧 http://tieba.baidu.com/ ...

  5. 欧拉工程第74题:Digit factorial chains

    题目链接:https://projecteuler.net/problem=74 数字145有一个著名的性质:其所有位上数字的阶乘和等于它本身. 1! + 4! + 5! = 1 + 24 + 120 ...

  6. ServletRequest中getReader()和getInputStream()只能调用一次的解决办法

    转载:http://blog.sina.com.cn/s/blog_870cd7b90101fg58.html 最近使用spring mvc做项目,数据格式是json,有一个功能是实现记录请求的参数, ...

  7. Debug模式应用程序输出Debug调试信息(现成的宏定义,用于格式化打印信息)

    // Debug模式,主要输出一些调试的信息. #ifdef UNICODE #define _FILE_          _STR2WSTR(__FILE__) #define _FUNCTION ...

  8. Qt出现警告 Unescaped backslashes are deprecated!解决办法

    Fixing Qt Warning: Unescaped backslashes are deprecated! From: http://www.openguru.com/2011/10/fixin ...

  9. IOS ARC与非ARC混合编译

    要开启ARC的:-fobjc-arc不开启ARC的:-fno-objc-arc 是否使用arc: 在build setting里找automatic reference counting,YES/NO

  10. C#画图解决闪烁问题

    导致画面闪烁的关键原因分析:       一.绘制窗口由于大小位置状态改变进行重绘操作时,绘图窗口内容或大小每改变一次,都要调用Paint事件进行重绘操作,该操作会使画面重新刷新一次以维持窗口正常显示 ...