转载请注明出处,谢谢 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;
}