题目:A. Little Elephant and Interval
题意:问某区间内首位和末位相等的数的数量
思路:数位dp
#include <bits/stdc++.h>
using i64 = long long;
using namespace std;
i64 f[20][12];
int a[20];
i64 dfs(int pos, int f1, int f2, bool flag1, bool flag2){
if(pos == -1) return f1 == f2;
if(f1 != 0 && !flag1 && f[pos][f1] != -1) return f[pos][f1];
i64 ans = 0;
int tt = flag1 ? a[pos] : 9;
for(int i = 0; i <= tt; i++){
ans += dfs(pos - 1, flag2 ? i : f1, i, flag1 && i == tt, flag2 && (i == 0));
}
if(!flag1 && f1 != 0) f[pos][f1] = ans;
return ans;
}
i64 cal(i64 n){
int t = 0;
while(n) a[t++] = n % 10, n /= 10;
return dfs(t - 1, 0, 0, 1, 1);
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
memset(f, -1, sizeof f);
i64 l, r;
cin >> l >> r;
cout << cal(r) - cal(l - 1) << "\n";
return 0;
}
暴力递归:把每位拆开与该位数字1-9比大小取最大
#include <bits/stdc++.h>
long long cal(long long x){
if(x <= 9) return x;
long long y = x / 10, z = x % 10;
while(x > 9) x /= 10;
return 9 + y - (x > z);
}
signed main(){
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
long long l, r;
std::cin >> l >> r;
std::cout << cal(r) - cal(l - 1) << "\n";
return 0;
}