您的位置:首页 > 大数据 > 人工智能

Fzu2109 Mountain Number 数位dp

2016-01-24 20:33 204 查看

Accept: 189 Submit: 461
Time Limit: 1000 mSec Memory Limit : 32768 KB

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
typedef long long ll;
int bits[20];
ll dp[20][15][2][2];
ll dfs(int pos, int pre, int iso, int doing) {
if(pos == -1) return 1;
int End = doing ? bits[pos] : 9;
ll& ans = dp[pos][pre][iso][doing];
if(ans != -1) return ans;
ans = 0;
for(int i = 0; i <= End; ++i) {
if(iso && i <= pre) ans += dfs(pos - 1, i, 0, doing && i == End);
else if(!iso && i >= pre) ans += dfs(pos - 1, i, 1, doing && i == End);
}
return ans;
}
ll calc(ll x) {
int ls = 0;
memset(dp, -1, sizeof dp);
while(x) {
bits[ls++] = x % 10;
x /= 10;
}
return dfs(ls - 1, 9, 1, 1);
}
int main() {
ll n, m;
int _;
cin >> _;
while(_ --) {
cin >> n >> m;
cout << calc(m) - calc(n - 1) << endl;
}
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: