生活随笔
收集整理的這篇文章主要介紹了
loj10165. 「一本通 5.3 例 3」Windy 数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
思路:
數位dp,設f[i][j]為以i為首元素, 長度為j, 的合題方案種數。
#include<cstdio>
#include<iostream>
#include<cstring>
#include<
string>
#include<cmath>
using namespace std;
const int maxn =
40;
long long f[maxn][maxn];
long long ppow10[maxn];
long long getws(
long long x){for(
int i =
18; i >=
0; --
i){if(x >=
ppow10[i])return i +
1;}return 1;
}
long long getxk(
long long x,
long long k){if(k > getws(x))
return 0;return (x / ppow10[k -
1]) %
10;
}
void init(){ppow10[0] =
1;for(
long long i=
1; i<=
20; ++
i)ppow10[i] = ppow10[i -
1] *
10; for(
int i=
0; i<
10; ++
i)f[i][1] =
1; for(
long long j=
2; j<=
11; ++
j)for(
long long i=
0; i<
10; ++
i)for(
long long k =
0; k<
10; ++
k)if(k <= i -
2 || k >= i +
2)f[i][j] += f[k][j-
1];
}
long long DP(
long long x,
long long ws){long long ans =
0;for(
long long i =
1; i < ws; ++
i)for(
long long j =
1; j <
10; ++
j)ans +=
f[j][i]; for(
long long i =
1; i < getxk(x, ws); ++
i)ans +=
f[i][ws]; for(
long long i = ws -
1; i >=
1; --
i){for(
long long j =
0; j < getxk(x, i); ++
j)if(j <= getxk(x, i +
1) -
2 || j >= getxk(x, i +
1) +
2)ans +=
f[j][i];if(getxk(x, i) > getxk(x, i +
1) -
2 && getxk(x, i) < getxk(x, i +
1) +
2)return ans; }return ans;
}
int main(
void)
{init();long long a, b;cin >> a >>
b;cout << DP(b +
1, getws(b +
1)) - DP(a, getws(a)) <<
endl;
} ?
轉載于:https://www.cnblogs.com/junk-yao-blog/p/9495374.html
總結
以上是生活随笔為你收集整理的loj10165. 「一本通 5.3 例 3」Windy 数的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。