首页 > 其他分享 >P2657 [SCOI2009] windy 数 数位DP好题

P2657 [SCOI2009] windy 数 数位DP好题

时间:2023-01-24 16:24:00浏览次数:57  
标签:ch const int 好题 pos windy SCOI2009 last define

P2657 [SCOI2009] windy 数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

数位DP好题

主要问题是:不含前导零且相邻两个数字之差至少为 2

solution:

现在枚举到了第 i 位

1.如果第 i-1 位是正常的数,不是前导0,那么只要 (第 i 位的数) - (第 i-1 位的数) ≥  2,便符合题意

2.如果第 i-1位是前导0,显然第 i 位 可以取 0~9 之间所有的数,

根据上面两点,当 第 i-1 位是正常的数,不是前导0  并且  (第 i 位的数) - (第 i-1 位的数) <  2 时,便是不符合条件的情况

if(abs(last-i)<2&&zero==0) continue;

 

DP维度:pos,limit,zero,上一位数(last)

Code:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define mp make_pair
#define pb push_back   //vector函数
#define popb pop_back  //vector函数
#define fi first
#define se second
const int N=20;
//const int M=;
//const int inf=0x3f3f3f3f;     //一般为int赋最大值,不用于memset中
//const ll INF=0x3ffffffffffff; //一般为ll赋最大值,不用于memset中
int T,n,len,a[N],dp[N][N][2][2];
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}
    return x*f;
}
int dfs(int pos,int last,bool lim,bool zero)
{
    if(pos>len) return 1;
    if(dp[pos][last][lim][zero]!=-1) return dp[pos][last][lim][zero];
    int res=0,num=lim?a[pos]:9;
    for(int i=0;i<=num;i++)
    {
        if(abs(last-i)<2&&zero==0) continue;
        res+=dfs(pos+1,i,lim && i==num,zero && i==0 );
    }
    return dp[pos][last][lim][zero]=res; 
} 
int solve(int x)
{
    len=0;
    memset(dp,-1,sizeof(dp));
    for(;x;x/=10) a[++len]=x%10;
    reverse(a+1,a+len+1);
    return dfs(1,0,1,1);
}
int main()
{
//    freopen("","r",stdin);
//    freopen("","w",stdout);    
    int l=read(),r=read();
    printf("%d\n",solve(r)-solve(l-1));
    return 0;
}

 

标签:ch,const,int,好题,pos,windy,SCOI2009,last,define
From: https://www.cnblogs.com/Willette/p/17066145.html

相关文章

  • 一些好题
    P3034不是很常规的题目。考虑奶牛之间的相对位置。因为一头奶牛最多跳出来一次,所以两头奶牛的相对位置最多改变两次。这样就可以求出任意两头奶牛的相对位置。这样的......
  • 好题分享、心路历程(力扣618)—— case when
    【题目介绍】该题为力扣618,名为学生地理信息报告。【题型分类】属于casewhen专题。官网标为困难题,符合。【思路分享】这里先分享where过滤的等价写法。关键点......
  • 省选好题记录
    正式转战省选了。听某神犇说需要刷够1000道省选/jk赶紧开刷。记录从2023年开始2023一月2023.1.2CF1142D十分牛逼的分治题目。题面:给定\(n\)个不降的数组。有一......
  • 好题分享、心路历程(力扣601)——连续登录
    【题目介绍】该题为力扣601,名为体育馆的人流量。【题型分类】属于连续专题。官网标为困难题。【思路分享】这里的连续类似时间连续,采用row_number()技巧解题。关......
  • Tarjan好题
    LuoguP5676[GZOI2017]小z玩游戏难度:提高+/省选-标签:Tarjan建图\(\mathtt{blog}\)......
  • 建图好题
    LuoguP5676[GZOI2017]小z玩游戏难度:提高+/省选-标签:Tarjan建图\(\mathtt{blog}\)......
  • 好题分享、心路历程(力扣2173)——连续登录
    【题目介绍】该题为力扣2173,名为最多连胜的次数。【题型分类】属于连续专题。官网标为困难题。【思路分享】这里的连续不属于时间连续,属于事件连续,采用两次row_numb......
  • 好题分享、心路历程(力扣1225)
    【题目介绍】该题为力扣1225,名为报告系统状态的连续日期。【题型分类】属于连续专题。官网标为困难题。【思路分享】这里的连续属于时间连续,采用row_number()、subd......
  • 差分好题
    Atcoder[ABC221D]Onlinegames难度:\(832\)标签:差分离散化\(\mathtt{blog}\)......
  • 离散化好题
    Atcoder[ABC221D]Onlinegames难度:\(832\)标签:差分离散化\(\mathtt{blog}\)......