动态规划
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
#define INF 1100000
char s1[1100],s2[1100];
int a[1100],b[1100],n;
int dp[1100][10][10];
void deal()
{
for(int i=1;i<=n;i++)
a[i]=s1[i-1]-'0';
for(int i=1;i<=n;i++)
b[i]=s2[i-1]-'0';
}
int dfs(int ii,int xx,int yy )
{
if(ii<=1)
return min((a[1]-yy+20)%10,(yy-a[1]+20)%10);
if(dp[ii][xx][yy]!=-1)
return dp[ii][xx][yy];
dp[ii][xx][yy]=INF;
int up=(yy-a[ii]+20)%10;
for(int i=0;i<=up;i++)
for(int j=0;j<=i;j++)
dp[ii][xx][yy]=min(dp[ii][xx][yy],
dfs(ii-1,(b[ii-2]-j+20)%10,(xx-i+20)%10)+up);
int down=10-up;
for(int i=0;i<=down;i++)
for(int j=0;j<=i;j++)
dp[ii][xx][yy]=min(dp[ii][xx][yy],
dfs(ii-1,(b[ii-2]+j+20)%10,(xx+i+20)%10)+down);
return dp[ii][xx][yy];
}
int main()
{
while(cin>>s1>>s2)
{
n=strlen(s1);
deal();
memset(dp,-1,sizeof(dp));
printf("%d\n",dfs(n,b[n-1],b[n]));
}
return 0;
}
本文深入探讨了动态规划的概念、原理及应用,通过实例展示了如何利用动态规划解决实际问题。主要内容包括动态规划的基本思想、状态转移方程的构建、递归与备忘录优化方法,以及一个具体的代码实现示例。
1523

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



