#include<bits/stdc++.h>
using namespace std;
#define ll long long
int a[20];
ll dp[20][MAXS1][MAXS2];
ll dfs(int pos,int s1,int s2,bool lead,bool limit) {
if(pos==-1) {
return ?;
}
if(!limit && !lead && dp[pos][s1][s2]!=-1)
return dp[pos][s1][s2];
int up=limit?a[pos]:9;
ll ans=0;
for(int i=0; i<=up; i++) {
int ns1=op1(s1);
int ns2=op2(s2);
ans+=dfs(pos-1,ns1,ns2,lead && i==0,limit && i==a[pos]);
}
if(!limit && !lead)
dp[pos][s1][s2]=ans;
return ans;
}
ll solve(ll x) {
if(x<=0)
return ?;
int pos=0;
while(x) {
a[pos++]=x%10;
x/=10;
}
return dfs(pos-1,INITS1,INITS2,true,true);
}
int main() {
memset(dp,-1,sizeof(dp));
ll le,ri;
while(~scanf("%lld%lld",&le,&ri)) {
printf("%lld\n",solve(ri)-solve(le-1));
}
}
转载于:https://www.cnblogs.com/Inko/p/11393887.html
本文深入探讨了使用C++实现动态规划算法的方法,通过一个具体的编程实例,详细讲解了如何利用递归和记忆化搜索解决复杂问题。文章首先定义了一个包含多个状态维度的三维动态规划数组,然后通过递归函数进行状态转移,最后通过主函数调用解决实际问题。适用于希望深入了解C++算法实现及动态规划技巧的读者。

被折叠的 条评论
为什么被折叠?



