博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HOJ 1447 Compromise (DP)
阅读量:5278 次
发布时间:2019-06-14

本文共 1134 字,大约阅读时间需要 3 分钟。

是一道要记录公共子序列内容的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

你可能感兴趣的文章
记叙在人生路上对你影响最大的三位老师
查看>>
002.大数据第二天
查看>>
python装饰器
查看>>
树上的路径
查看>>
【转载】TCP好文
查看>>
系统平均负载
查看>>
【并发】实现内存可见的两种方法比较:加锁和volatile变量
查看>>
[线段树]/[水法] Jzoj P100036 随机
查看>>
问题总结
查看>>
jenkins升级为2.134
查看>>
软件随笔
查看>>
C/C++知识补充 (1)
查看>>
Fast Poisson Disk Sampling
查看>>
Python Cookbook(第3版)中文版:15.14 传递Unicode字符串给C函数库
查看>>
python之socket模块
查看>>
Linux下SVN自动更新web [转]
查看>>
线程系列02,多个线程同时处理一个耗时较长的任务以节省时间
查看>>
编程:对经验世界的析构与建构
查看>>
Openstack api 学习文档 & restclient使用文档
查看>>
vim linux下查找显示^M并且删除
查看>>