zoukankan      html  css  js  c++  java
  • [bzoj1026][SCOI2009]windy数(前缀和+数位dp)

    传送门
    (明明这么一个水题,我居然被坑了这么久)
    数位dp。
    首先前缀和,答案就是solve(b)-solve(a-1),然后预处理dp,每次统计答案。
    可以看这篇blog
    代码:

    /**************************************************************
        Problem: 1026
        User: stone41123
        Language: C++
        Result: Accepted
        Time:0 ms
        Memory:1288 kb
    ****************************************************************/
     
    #include<bits/stdc++.h>
    #define ll long long
    using namespace std;
    char s[20],s1[20];
    int len;
    int a[20];
    int f[20][20];
     
    int solve(){
        memset(f,0,sizeof(f));
        for(int i=0;i<=9;i++){
            f[1][i]=1;
        }
        for(int i=2;i<=len;i++){
            for(int j=0;j<=9;j++){
                for(int k=0;k<=9;k++){
                    if(abs(j-k)>=2){
                        f[i][j]+=f[i-1][k];
                    }
                }
            }
        }
        int ans=0;
        for(int i=1;i<len;i++){
            for(int j=1;j<=9;j++){
                ans+=f[i][j];
            }
        }
        for(int i=1;i<a[len];i++){
            ans+=f[len][i];
        }
        for(int i=len-1;i>=1;i--){
            for(int j=0;j<a[i];j++){
                if(abs(a[i+1]-j)>=2)ans+=f[i][j];
            }
            if(abs(a[i+1]-a[i])<2)break;
        }
        return ans;
    }
    int main(){
        scanf("%s",s);
        len=strlen(s);
        for(int i=1;i<=len;i++){
            a[i]=s[len-i]-'0';
        }
        int ans=0;
        ans-=solve();
        memset(a,0,sizeof(a));
        scanf("%s",s1);
        len=strlen(s1);
        for(int i=1;i<=len;i++){
            a[i]=s1[len-i]-'0';
        }
        ans+=solve();
        int flag=1;
        for(int i=2;i<=len;i++){
            if(abs(a[i-1]-a[i])<2){
                flag=0;
            }
        }
        ans+=flag;
        printf("%d",ans);
        return 0;
    }
    
  • 相关阅读:
    iPhone X 的“刘海”正是苹果的品牌象征
    中国首届原型设计大赛在成都举办
    hdu1114Piggy-Bank(完全背包)
    hdu2602Bone Collector(01背包)
    漏洞百出的线段树!!
    hdu1078FatMouse and Cheese
    hdu2859Phalanx
    poj3186Treats for the Cows(区间dp)
    uva10088格点多边形
    快速幂快速乘
  • 原文地址:https://www.cnblogs.com/stone41123/p/7600598.html
Copyright © 2011-2022 走看看