【链接】http://hihocoder.com/problemset/problem/1554


【题意】


中文题

【题解】


DP;
设f[i][j][k]表示前i个字符,第一个串已经得到了前j个字符,第二个串已经得到了前k个字符的最少需要字符串长度.
如果想坚持f[i-1][j][k]的[j][k]状态的话,就必须在第i个字符继续坚持,也即再加上一个字符.
或者你想重新开始,所以每次新的f[i]中f[i][0][0] = 0,其余f[i]=INF;
或者可以和第一个字符串匹配到,则从f[i-1][j][k]变为f[i][jj+1][k],或者是f[i][j][k+1]...

【错的次数】


3

【反思】


一开始写的二分+贪心。。然而完全是瞎猜的。

【代码】

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0) typedef pair<int,int> pii;
typedef pair<LL,LL> pll; const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N1 = 100;
const int N2 = 3000;
const int INF = 0x3f3f3f3f; char a[N1+10],b[N1+10],s[N2+10];
int lena,lenb,f[2][N1+10][N1+10]; int main(){
    //Open();
    //Close();
    rs(a);
    rs(b);
    rs(s);
    lena = strlen(a+1),lenb = strlen(b+1);
    int n = strlen(s+1);
    ms(f[0],INF);
    f[0][0][0] = 0;
    int ans = -1;
    rep1(i,1,n){
        int now = i&1,pre = now^1;
        ms(f[now],INF);
        f[now][0][0] = 0;
        rep1(j,0,lena)
            rep1(k,0,lenb)
                if (f[pre][j][k]<INF){
                    f[now][j][k] = min(f[pre][j][k] + 1,
                                       f[now][j][k]);
                    if (s[i] == a[j+1]){
                        f[now][j+1][k] = min(f[now][j+1][k],
                                            f[pre][j][k]+1);
                    }
                    if (s[i] == b[k+1]){
                        f[now][j][k+1] = min(f[now][j][k+1],
                                            f[pre][j][k]+1);
                    }
                }
        int tans = f[now][lena][lenb];
        if (tans >= INF) continue;
        if (ans==-1 || tans < ans){
            ans = tans;
        }
    }
    oi(ans);puts("");
    return 0;
}

最新文章

  1. Quartz任务调度基本使用
  2. 团队项目——站立会议DAY9
  3. 小Experience__要懂得努力
  4. JAVA自动化测试中多数据源的切换
  5. 第一章 : javaScript框架分类及主要功能
  6. PHP_Const
  7. JSP 中的几种注释
  8. Codeforces 710 E. Generate a String (dp)
  9. 三菱plc输出指示灯不亮怎么办(转载)
  10. Java 中UDP原理机制及实现方式介绍(建议阅读者阅读前了解下Java的基础知识,一方便理解)
  11. Python中的模块介绍和使用
  12. 认清Javascript的地位并编写合理的Javascript代码
  13. Oracle中的decode()函数
  14. Docker -v 对挂载的目录没有权限 Permission denied
  15. python第九天(9-34)
  16. Java中封装类型.valueOf()
  17. python基础语法二
  18. ios-复制字符串到剪贴板
  19. react native环境搭建(含错误处理)
  20. DNS区域传送漏洞的安全案例

热门文章

  1. firewall&amp;iptables小记
  2. configure: error: libXpm.(a|so) not found
  3. CF 1150 D Three Religions——序列自动机优化DP
  4. What size do you use for varchar(MAX) in your parameter declaration?
  5. Tomcat负载均衡、调优核心应用进阶学习笔记(三):LNMT nginx+tomcat、LAMT apache+tomcat、session会话保持、不错的站点
  6. ES6数组中删除指定元素
  7. python学习笔记:函数
  8. 在JMeter测试计划中如何控制业务比例
  9. mybatis自学历程(一)
  10. python面试题之补充缺失的代码