zoukankan      html  css  js  c++  java
  • P2567.[SCOI2009] windy 数(数位DP)

    题目背景

    windy 定义了一种 windy 数。

    题目描述

    不含前导零且相邻两个数字之差至少为2的正整数被称为windy数。windy想知道,在a和b之间,包括a和b之间,包括a和b,总共有多少个windy数?

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn=1010;
    typedef long long ll;
    ll f[20][20];//f(i,j)表示搜到第i位,前一位是j的合法方案数
    int a[20],len;
    ll L,R;
    ll dfs (int pos,int pre,int st,int limit) {
    	//pos表示当前位置
    	//pre表示前一位数
    	//st表示前面是否全为0
    	//limit表示最高位限制
    	
    	if (pos>len) return 1;//dfs终点 
    	if (!limit&&f[pos][pre]!=-1) return f[pos][pre];
    	//没有最高位限制,并且已经搜过了
    	ll ans=0;
    	ll k=limit?a[len-pos+1]:9;//当前位最大数字
    	for (int i=0;i<=k;i++){
    		//从0枚举最大数字 
    		if (abs(i-pre)<2) continue;
    		//不符合题意,继续
    		if (st&&i==0) {
    			//如果前面全为0,下一位随意
    			ans+=dfs(pos+1,-2,1,limit&&i==k);
    			//如果有前导0,下一位随意 
    		} 
    		else {
    			//如果没有前导0,继续按部就班的搜
    			ans+=dfs(pos+1,i,0,limit&&i==k); 
    		}
    	} 
    	if (!limit&&!st) {
    		//没有最高位限制且没有前导0时记录结果 
    		f[pos][pre]=ans;
    	}
    	return ans;
    } 
    ll solve (ll x) {
    	len=0;
    	while (x) a[++len]=x%10,x/=10;
    	memset(f,-1,sizeof(f));
    	return dfs(1,-2,1,1); 
    }
    int main () {
    	cin>>L>>R;
    	cout<<solve(R)-solve(L-1);
    }
  • 相关阅读:
    475. Heaters
    69. Sqrt(x)
    83. Remove Duplicates from Sorted List Java solutions
    206. Reverse Linked List java solutions
    100. Same Tree Java Solutions
    1. Two Sum Java Solutions
    9. Palindrome Number Java Solutions
    112. Path Sum Java Solutin
    190. Reverse Bits Java Solutin
    202. Happy Number Java Solutin
  • 原文地址:https://www.cnblogs.com/zhanglichen/p/14588851.html
Copyright © 2011-2022 走看看