HDU2089
地址:http://acm.hdu.edu.cn/showproblem.php?pid=2089
代码:
#include<iostream>
#include<cmath>
//#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//#define M 1000000007
int main()
{
int i,j,k,m,n,dp[10][20]={0};
dp[0][0]=1;
for(i=1;i<=7;i++) //打表
{
for(j=0;j<=9;j++)
for(k=0;k<=9;k++)
if(j!=4&&k!=4&&!(j==6&&k==2))
dp[i][j]+=dp[i-1][k];
}
while(scanf("%d%d",&m,&n)>0,m||n)
{
int len1,len11[10]={0},len2,len22[10]={0};
len1=len2=0;
while(m)
{
len11[len1++]=m%10;
m/=10;
}
while(n)
{
len22[len2++]=n%10;
n/=10;
}
int ans=0;
for(i=len1-1;i>=0;i--) //求出m之前有多少数字符合情况
{
for(j=0;j<len11[i];j++)
{
if(j!=4&&!(j==2&&len11[i+1]==6))
ans-=dp[i+1][j];
}
if(j==4||(j==2&&len11[i+1]==6)) break;
}
for(i=len2-1;i>=0;i--) //求出n之前有多少数字符合情况
{
for(j=0;j<len22[i];j++)
{
if(j!=4&&!(j==2&&len22[i+1]==6))
ans+=dp[i+1][j];
}
if(j==4||(j==2&&len22[i+1]==6)) break;
}
for(i=0;i<len2;i++) //判断m是否符合情况
if(len22[i]==4||(len22[i]==2&&len22[i+1]==6)) break;
if(i==len2) ans++;
printf("%d\n",ans);
}
return 0;
}
HUD3555
地址:http://acm.hdu.edu.cn/showproblem.php?pid=3555
思路:纯数位dp,直接模板,不解释。
代码:
#include<iostream>
#include<cmath>
//#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
//#define M 1000000007
int main() //我这里连变量都懒得改了&#