HOJ 1447 Compromise (DP)

是一道要记录公共子序列内容的DP。

状态转移方程部分:

for(int i=1; i<=len1; i++)
        {
            for(int j=1; j<=len2; j++)
            {
                if(!strcmp(str1[i],str2[j]))
                {
                    f[i][j]=f[i-1][j-1]+1;
                }
                else
                {
                    f[i][j]=max(f[i-1][j],f[i][j-1]);
                }
            }
        }


前半部分先是正常的DP,输出时要倒过来进行判断。

  

 int i=len1;
       int j=len2;
       int k=0;
       while (i >= 1 && j >=1)
       {
           if ((f[i][j] == f[i-1][j-1] +1)&&(f[i][j] != f[i-1][j])&&(f[i][j] != f[i][j-1]))
           {
               strcpy(record[k++],str1[i]);
               i--;
               j--;
           }
           else if (f[i][j] == f[i-1][j]) i--;
           else if (f[i][j] == f[i][j-1])j--;
       }
       k--;
       while(k>=1)           //输出的时候一定要小心~!~!~!注意空格,回车
       {
           printf("%s ",record[k]);
           k--;
       }

通过if判断出每一个状态f[i][j]是从哪一个状态转移过来的,如果是从f[i-1][j-1]转移过来的话,则说明这里str1[i]==str2[j],是公共的。用一个二维字符数组记录下这一公共的字符串。

最后,再将record倒序输出。

这题被卡了很久主要是输出时的空格和换行没处理好。貌似是在最后一个单词后面多输出了一个空格。。要细心啊~

转载于:https://www.cnblogs.com/MicZ/archive/2012/08/24/2785376.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值