请问数位dp何时可以这么写
查看原帖
请问数位dp何时可以这么写
212833
EEchoyukii楼主2021/2/13 17:46

这题这么写过了。

int S(int x){
    memset(f,-1,sizeof(f));a[0]=0;
    while(x)a[++a[0]]=x%10,x/=10;if(a[0]!=11)return 0;
    for(register int l=1,r=a[0];l<r;++l,--r)swap(a[l],a[r]);
    register int ret=0;
    for(register int v=1;v<=a[1];++v)ret+=dfs(2,v==8,v==4,v,11,0,v==a[1]);
    return ret;
}

windy 数那题这么写没过样例。 https://www.luogu.com.cn/problem/P2657

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define int long long 
inline int read(){
    register int x=0,f=0,ch=getchar();
    while('0'>ch||ch>'9')f^=ch=='-',ch=getchar();
    while('0'<=ch&&ch<='9')x=(x<<1)+(x<<3)+(ch^'0'),ch=getchar();
    return f?-x:x;
}
const int MAX=20;
int L,R,a[MAX],f[MnAX][MAX][2];
inline int abss(int x){
    return x<0?-x:x;
}
int dfs(int pos,int last,int lim){
    if(pos==a[0]+1)return 1;
    if(f[pos][last][lim]!=-1)return f[pos][last][lim];
    register int ret=0,mx=lim?a[pos]:9;
    for(register int v=0;v<=mx;++v)if(abss(v-last)>=2)ret+=dfs(pos+1,v,lim&&v==a[pos]);
    return f[pos][last][lim]=ret;
}
inline int sum(int x){
    if(x==0)return 1;
    memset(f,-1,sizeof(f));a[0]=0;while(x)a[++a[0]]=x%10,x/=10; 
    for(register int l=1,r=a[0];l<r;++l,--r)swap(a[l],a[r]);
    register int ret=0;
    for(register int v=1;v<=a[1];++v)ret+=dfs(2,v,v==a[1]);
    return ret;
}
signed main(){
    L=read(),R=read(); 
    printf("%lld\n",sum(R)-sum(L-1));
    return 0;
}
2021/2/13 17:46
加载中...