sgu 214 分类: sgu 2015-06...


参考题解:http://blog.csdn.net/qq_20118433/article/details/45653577


贴发代码就跑。。。

sgu上的C++编译器开了不稳定的O2优化,
所以我用C++交无限WA on test 16,
用C++_VS提交或改成C语言提交就AC了。。。


感觉不会再爱了。。。。。。


C语言代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<stdbool.h>

#define size  256
#define maxl  2005
#define INF  0x3f3f3f3f

char s[size]; int sl;
int w[size][size], fc[size];

char sa[maxl], sb[maxl];
int a[maxl], b[maxl], al, bl;

int f[maxl][maxl],pre[maxl][maxl];

int ma[size], mb[size];
int mina[size], minb[size];

int len;
char ansa[maxl<<1];
char ansb[maxl<<1];

void add(char da,char db)
{
    ansa[len] = da, ansb[len] = db, len++;
}
void dfs(int ta,int tb)
{
    switch(pre[ta][tb])
    {
        case 1: dfs(ta-1,tb), add(sa[ta-1],s[ma[a[ta-1]]]); break;
        case 2: dfs(ta,tb-1), add(s[mb[b[tb-1]]],sb[tb-1]); break;
        case 3: dfs(ta-1,tb-1), add(sa[ta-1],s[b[tb-1]]);   break;
    }
}

int main()
{
    int i, j;

#ifndef ONLINE_JUDGE
    freopen("sgu214.in","r",stdin);
    freopen("sgu214.out","w",stdout);
#endif

    scanf("%s%s%s",s,sa,sb);
    sl = strlen(s), al = strlen(sa), bl = strlen(sb);

    for(i = 0; i < sl; i++) fc[s[i]] = i;    

    for(i = 0; i < al; i++) a[i] = fc[sa[i]];
    for(i = 0; i < bl; i++) b[i] = fc[sb[i]];

    for(i = 0; i < sl; i++)
        for(j = 0; j < sl; j++)
            scanf("%d",&w[i][j]);

    for(i = 0; i < sl; i++)
        for(j = 0; j < sl; j++)
        {
            if(w[i][j] < w[i][ma[i]]) ma[i] = j;
            if(w[i][j] < w[mb[j]][j]) mb[j] = i;
        }        

    for(i = 0; i < sl; i++) 
        mina[i] = w[i][ma[i]], minb[i] = w[mb[i]][i];

    f[0][0] = 0, pre[0][0] = 0; 

    for(i = 1; i <= al; i++)
        f[i][0] = f[i-1][0] + mina[a[i-1]], pre[i][0] = 1;
    for(j = 1; j <= bl; j++)
        f[0][j] = f[0][j-1] + minb[b[j-1]], pre[0][j] = 2;

    for(i = 1; i <= al; i++)
        for(j = 1; j <= bl; j++)
        {
            int t1 = f[i-1][j] + mina[a[i-1]],
                t2 = f[i][j-1] + minb[b[j-1]],
                t3 = f[i-1][j-1] + w[a[i-1]][b[j-1]]; 

            if(t1 <= t2)
                f[i][j] = t1, pre[i][j] = 1;
            else
                f[i][j] = t2, pre[i][j] = 2;

            if(t3 < f[i][j])
                f[i][j] = t3, pre[i][j] = 3;
        }

    printf("%d\n",f[al][bl]);

    dfs(al,bl), puts(ansa), puts(ansb);     

#ifndef ONLINE_JUDGE
    fclose(stdin);
    fclose(stdout);
#endif
    return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

转载于:https://www.cnblogs.com/dashgua/p/4722997.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值