几个基础数位DP (hdu 2089,hdu 3555 ,uestc 1307 windy 数)

转载请注明出处,谢谢 http://blog.csdn.net/ACM_cxlove?viewmode=contents           by---cxlove

做了几个非常基础的数位DP,很水。弱爆了,接下来要进行进阶训练了

HDU 2089 不要62

http://acm.hdu.edu.cn/showproblem.php?pid=2089

不能出现4,或者相邻的62,这题可以暴力打表解决

具体的在代码里都有解释

#include
#include
#include
#include
#include
#include
#define N 55
#define inf 1<<29
#define MOD 9973
#define LL long long
#define eps 1e-7
#define zero(a) fabs(a)4)  //高位可能出现4的情况
            ans+=dp[i-1][0];
        if(!flag&&bit[i+1]==6&&bit[i]>2)  //高位是6,后面一位可能出现2,这步debug了很久
            ans+=dp[i][1];
        if(!flag&&bit[i]>6)  //高位可能出现6,要把后面最高位为2计入
            ans+=dp[i-1][1];
        if(bit[i]==4||(bit[i+1]==6&&bit[i]==2))  //高位已经出现4或者62
            flag=true;
    }
    return tmp-ans;
}
int main(){
    int l,r;
    Init();
    while(scanf("%d%d",&l,&r)!=EOF&&l+r)
        printf("%d\n",slove(r+1)-slove(l));
    return 0;
}


HDU 3555 BOMB

http://acm.hdu.edu.cn/showproblem.php?pid=3555

不能出现相邻的49,和上一题类似

#include
#include
#include
#include
#include
#include
#define N 55
#define inf 1<<29
#define MOD 9973
#define LL long long
#define eps 1e-7
#define zero(a) fabs(a)4)
                ans+=dp[i-1][1];
            if(bit[i]==9&&bit[i+1]==4)
                flag=true;
        }
        printf("%I64d\n",ans);
    }
    return 0;
}


UESTC 1307 WINDY 数

http://acm.uestc.edu.cn/problem.php?pid=1307

要求相邻的数差大于等于2

#include
#include
#include
#include
#include
#include
#define N 100005
#define inf 1<<29
#define MOD 9973
#define LL long long
#define eps 1e-7
#define zero(a) fabs(a)=2)
					dp[i][j]+=dp[i-1][k];
		}
	}
}
int slove(int n){
	int len=0,bit[15];
	while(n){
		bit[++len]=n%10;
		n/=10;
	}
	bit[len+1]=0;
	int ans=0;
	//先把长度为1至len-1计入
	for(int i=1;i=2)
				ans+=dp[i][j];
		//如果高位已经出现非法,直接退出
		if(abs(bit[i]-bit[i+1])<2)
			break;
	}
	return ans;
}
int main(){
	Init();
	int l,r;
	while(scanf("%d%d",&l,&r)!=EOF)
		printf("%d\n",slove(r+1)-slove(l));
	return 0;
}









你可能感兴趣的:(ACM_DP)