原题:zjnu 1273
题意:
解析:
用dp[i][j]表示匹配到第一个串前i个,第二个串前j个的最大得分
对于i,j,有以下几种可能
- a[i]==b[j],那么dp[i][j]=dp[i-1][j-1]+2,这种情况一定是当下最优解,可continue了
- 不相等时,第一种情况是直接让i和j处于不匹配状态,dp[i][j]=dp[i-1][j-1]
- 第二种是在dp[1~i][j]或dp[i][1~j]中插括号得到dp[i][j],dp[i][j]=max(dp[1~i][j],dp[i][1~j])-1
不处理左边的,但是我们dp[1][1]的初始值就是0,所以直接忽略。。。
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<string>
#include<string.h>
#include<map>
#include<queue>
#include<bitset>
using namespace std;
string a,b;
int dp[53][53];
int main(){
cin>>a>>b;
int l1=a.length(),l2=b.length();
a=' '+a;b=' '+b;
for(int i=1;i<=l1;i++){
for(int j=1;j<=l2;j++){
if(a[i]==b[j]){dp[i][j]=dp[i-1][j-1]+2;continue;}
for(int k=1;k<i;k++)dp[i][j]=max(dp[i][j],dp[k][j]-1);
for(int k=1;k<j;k++)dp[i][j]=max(dp[i][j],dp[i][k]-1);
dp[i][j]=max(dp[i][j],dp[i-1][j-1]);
}
}
printf("%d\n",dp[l1][l2]);
}