zoukankan      html  css  js  c++  java
  • [SCOI2009]windy数 代码 (对应数位dp入门)

    Code1 (DP版)

    #include<bits/stdc++.h>
    #define in(i) (i=read())
    using namespace std;
    int read()
    {
    	int ans=0,f=1;
    	char i=getchar();
    	while(i<'0' || i>'9') {
    		if(i=='-') f=-1;
    		i=getchar();
        }
    	while(i>='0' && i<='9') {
    		ans=(ans<<1)+(ans<<3)+i-'0';
    		i=getchar();
        }return ans*f;
    }
    int dp[12][10],bit[10];
    
    void init()
    {
    	for(int i=0;i<=9;i++) dp[1][i]=1;
    	for(int i=2;i<=10;i++) {
    		for(int j=0;j<10;j++)
    			for(int k=0;k<10;k++)
    				if(abs(j-k)>=2) dp[i][j]+=dp[i-1][k];
        }
    }
    
    int solve(int x)
    {
    	if(x==0) return 0; int ans=0,len=0;
    	memset(bit,0,sizeof(bit));
    	while(x) {
    		bit[++len]=x%10;
    		x/=10;
        }
    	for(int i=1;i<=len-1;i++)
    		for(int j=1;j<=9;j++)
    			ans+=dp[i][j];
    	for(int i=1;i<bit[len];i++) ans+=dp[len][i];
    	for(int i=len-1;i>=1;i--) {
    		for(int j=0;j<bit[i];j++)
    			if(abs(bit[i+1]-j)>=2) ans+=dp[i][j];
    		if(abs(bit[i+1]-bit[i])<2) break;
    		if(i==1) ans++;
        }return ans;
    }
    int main()
    {
    	init(); int a,b;
    	in(a);in(b);
    	cout<<solve(b)-solve(a-1)<<endl;
    }
    

    Code2(记忆化搜索版)

    #include<bits/stdc++.h>
    #define in(i) (i=read())
    using namespace std;
    int read()
    {
    	int ans=0,f=1;
    	char i=getchar();
    	while(i<'0' || i>'9') {
    		if(i=='-') f=-1;
    		i=getchar();
        }
    	while(i>='0' && i<='9') {
    		ans=(ans<<1)+(ans<<3)+i-'0';
    		i=getchar();
        }return ans*f;
    }
    int bit[11], dp[11][10];
    int dfs(int len,int pre,int f,int limit)
    {
    	int ans=0;
    	if(!len) return 1;
    	if(!limit && f && dp[len][pre]) return dp[len][pre];
    	int maxn=limit?bit[len]:9;
    	for(int i=0;i<=maxn;i++)
        {
    		if(abs(i-pre)>=2) {
    			int p=i;
    			if(pre==-10 && !i) p=pre;
    			ans+=dfs(len-1,p,f||i!=0,limit && i==maxn);
    		}
        }
    	if(!limit && f) dp[len][pre]=ans;
    	return ans;
    }
    int solve(int a)
    {
    	memset(bit,0,sizeof(bit));
    	int k=0;
    	while(a) {
    		bit[++k]=a%10;
    		a/=10;
        }return dfs(k,-10,0,1);
    }
    int main()
    {
    	int a,b;
    	in(a);in(b);
    	cout<<solve(b)-solve(a-1)<<endl;
    	return 0;
    }
    
  • 相关阅读:
    研究人员用数据统计的方法来做文学研究
    导致大数据项目失败的4大痛点及应对策略
    导致大数据项目失败的4大痛点及应对策略
    excel怎么制作三维圆环图表
    excel怎么制作三维圆环图表
    ios开发之Swift新手入门
    ZOJ3629 Treasure Hunt IV(找规律,推公式)
    nginx源代码分析--进程间通信机制 &amp; 同步机制
    &lt;LeetCode OJ&gt; 326. Power of Three
    二进制整数的乘除运算
  • 原文地址:https://www.cnblogs.com/real-l/p/11853017.html
Copyright © 2011-2022 走看看