博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1159 Common Subsequence (最长公共子序列)
阅读量:6533 次
发布时间:2019-06-24

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

  文章作者:ktyanny 文章来源: 转载请注明,谢谢合作。  

  

   ktyanny本打算复习考试周研究一下动态规划,今天早上起得很晚,爬起来就想起这件事了,找到一个最水的最长公共子序列的题目,其实算是裸题了。

  题目的意思就是给出两个串x和y,让你输出出他们的最长公共子序列(LCS)的长度。于是在纸上模拟了半晌,终于搞懂了记忆化(memoization)是怎么个原理了。下面讲讲LCS的过程吧:

   

LCS
-
LENGTH(X, Y, m, n)
   
for
 i ← 
1
 to m   
do
  c[i, 
0
] ← 
0
   
for
 j ← 
0
 to n     
do
 c[
0
, j] ← 
0
   
for
 i ← 
1
 to m    
do
         
for
 j ← 
1
 to n 
do
              
if
 xi 
=
 yj
              then c[i, j] ← c[i 
-
 
1
, j 
-
 
1
+
 
1
 
             
else
 
if
 c[i 
-
 
1
, j] ≥ c[i, j 
-
 
1
]
               then c[i, j] ← c[i 
-
 
1
, j]
                
else
 c[i, j] ← c[i, j 
-
 
1
]
return
 c and b

 

  好!根据上面的伪代码,自己跟踪一下c[i][j]数组的变化情况问题就变得很清晰了。

 下面是1159的ac代码

  46MS C++

#include 
<
iostream
>
#include 
<
string
.h
>
using
 
namespace
 std;
const
 
int
 MAX 
=
 
1000
;
int
 c[MAX
+
5
][MAX
+
5
];
int
 lcs(
char
 
*
x, 
char
 
*
y, 
int
 c[][MAX
+
5
])
{
    
int
 i, j, m 
=
 strlen(x), n 
=
 strlen(y);
    
for
(i 
=
 
0
; i 
<
 m; i
++
) c[i][
0
=
 
0
;
    
for
(i 
=
 
0
; i 
<
 n; i
++
) c[
0
][i] 
=
 
0
;
    
for
(i 
=
 
0
; i 
<
 m; i
++
)
    {
        
for
(j 
=
 
0
; j 
<
 n; j
++
)
        {
            
if
(x[i] 
==
 y[j])
                c[i
+
1
][j
+
1
=
 c[i][j] 
+
 
1
;
            
else
                
if
(c[i][j
+
1
>=
 c[i
+
1
][j])
                    c[i
+
1
][j
+
1
=
 c[i][j
+
1
];
                
else
                    c[i
+
1
][j
+
1
=
 c[i
+
1
][j];
        }
    }
    
return
 c[m][n];
}
int
 main()
{
    
char
 x[MAX];
    
char
 y[MAX];
    
while
(cin 
>>
 x 
>>
 y)
        cout 
<<
 lcs(x, y, c) 
<<
 endl;
    
return
 
0
;
}

 

 

  下面记下流水账。 

  上个星期伙食吃超支了,吃了两次麦当劳,打了一次火锅,光了四次超市,昨天还去地下商场吃大家乐。再这样逍遥下去的话我就木有米吃饭了。昨晚睡觉也很玄,可能吃太好了。是这个学期第二次梦到我有一部笔记本了,不过结局好惨,居然被我玩到着火了,囧……第一次梦到自己有笔记本是妈妈说同意我用自己的奖学金买笔记本。等奖学金拿到手的时候, 我倒是想买个电磁炉,因为预测到寒假的饭菜肯定很难啃,想自己学着炒菜啊,好吃又便宜的。嘎嘎……

转载于:https://www.cnblogs.com/ktyanny/archive/2009/12/27/1633315.html

你可能感兴趣的文章
javascript测试输入以空格隔开的字符串中是否有重复的字符串,并且输出
查看>>
Crontab 命令需要注意的地方
查看>>
诺基亚的情怀正变得越来越廉价
查看>>
域帐号密码过期邮件提醒
查看>>
华为交换机DHCP SNOOPING 配置实例
查看>>
虚拟防火墙方案
查看>>
上传本地项目到git.oschina
查看>>
ZooKeeper Java Api 使用样例
查看>>
我的友情链接
查看>>
TightVNC 企业内部部署
查看>>
Exchange 2013 DAG报错“The fully qualified domain name for node “DAG” could notbefound”解决方法...
查看>>
php 数组元素 频率 次数
查看>>
从0开始学习 GITHUB 系列之「GITHUB 常见的几种操作」
查看>>
MFC应用程序向导生成的最简单程序HelloMFC详解
查看>>
BIND+DLZ智能解析系统
查看>>
我的友情链接
查看>>
分析工具TVD$XTAT简单使用
查看>>
通过内推来应聘职位,你的体验是怎样的?
查看>>
Java并发系列学习(三)
查看>>
嵌入式Linux:基于ARM11下Android应用点亮LED灯 【PDF版论文下载】
查看>>