[bzoj]1026: [SCOI2009]windy数

来源:互联网 发布:云米超能滤水壶 知乎 编辑:程序博客网 时间:2024/04/19 16:36

看题目很容易想到数位dp,具体做法看这位的:http://blog.csdn.net/zz_ylolita/article/details/50754618

讲的还是很详细的。

#include <cstdio>#include <cstring>#include <algorithm>#define ll long longusing namespace std;ll a,b;int len,d[12];ll dp[12][12];ll work(ll x){register int i,j;ll re=0;if (x==0) return 0;len=0,memset(d,0,sizeof(d));while (x>0){d[++len]=x%10;x/=10;}for (i=1;i<=d[len]-1;i++){re+=dp[len][i];}for (i=len-1;i>0;i--)for (j=1;j<=9;j++){re+=dp[i][j];}for (i=len-1;i>0;i--){for (j=0;j<=d[i]-1;j++){if (abs(d[i+1]-j)>=2) re+=dp[i][j];}if (abs(d[i+1]-d[i])<2) break;}return re;}int main(){register int i,j,k;scanf("%lld %lld",&a,&b);for (i=0;i<=9;i++) dp[1][i]=1;for (i=2;i<=10;i++)for (j=0;j<=9;j++)for (k=0;k<=9;k++){if (abs(j-k)>=2)dp[i][j]+=dp[i-1][k];}printf("%lld\n",work(b+1)-work(a));return 0;}