问题 H: Column Addition
时间限制: 1 Sec 内存限制: 128 MB提交: 207 解决: 41
[ 提交][ 状态][ 讨论版][命题人: admin]
题目描述
A multi-digit column addition is a formula on adding two integers written like this:
A multi-digit column addition is written on the blackboard, but the sum is not necessarily correct. We can erase any
number of the columns so that the addition becomes correct. For example, in the following addition, we can obtain a
correct addition by erasing the second and the forth columns.
Your task is to find the minimum number of columns needed to be erased such that the remaining formula becomes a
correct addition.
输入
There are multiple test cases in the input. Each test case starts with a line containing the single integer n, the number of
digit columns in the addition (1 ⩽ n ⩽ 1000). Each of the next 3 lines contain a string of n digits. The number on the third
line is presenting the (not necessarily correct) sum of the numbers in the first and the second line. The input terminates
with a line containing “0” which should not be processed.
输出
For each test case, print a single line containing the minimum number of columns needed to be erased.
样例输入
3
123
456
579
5
12127
45618
51825
2
24
32
32
5
12299
12299
25598
0
样例输出
0
2
2
1
【分析】
dp克我。细节克我
题意:给出一个加法竖式,问最少删除几列,可以使得加法式正确。
dp[k][i]表示以i位作为最高位时,可以得到的最长的式子。最后用n减掉最长的。k表示是否进位
i位的状态有j得到,j是i的低位;
注意:若j需要进位才能正确,则要求dp[1][j]>0才能更新i状态
【代码】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e6+5;
const int INF=0x3f3f3f3f;
int dp[2][1010];
char a[3030],b[2303],c[3030];
int main()
{
int n;
while(cin>>n,n)
{
scanf("%s",a+1);
scanf("%s",b+1);
scanf("%s",c+1);
for(int i=1;i<=n;i++)a[i]-='0';
for(int i=1;i<=n;i++)b[i]-='0';
for(int i=1;i<=n;i++)c[i]-='0';
memset(dp,0,sizeof(dp));
for(int i=n;i>=1;i--)
{
for(int j=n+1;j>i;j--)
{
if(a[i]+b[i]==c[i])
dp[0][i]=max(dp[0][i],dp[0][j]+1);
if(a[i]+b[i]+1==c[i]&&dp[1][j])
dp[0][i]=max(dp[0][i],dp[1][j]+1);
if(a[i]+b[i]==c[i]+10)
dp[1][i]=max(dp[1][i],dp[0][j]+1);
if(a[i]+b[i]+1==c[i]+10&&dp[1][j])
dp[1][i]=max(dp[1][i],dp[1][j]+1);
}
}
int ans=0;
for(int i=1;i<=n;i++){
ans=max(ans,dp[0][i]);
}
printf("%d\n",n-ans);
}
}