您的位置:首页 > 其它

HDU-1159(DP_最长公共子序列)

2012-08-15 21:01 465 查看
看了一上午的DP了,下午去家教了就没有看了,,,但其实在很久以前我已经解除过DP了,

为什么今天又继续学习呢,,主要是觉得,这是一种思想,是一种类似于设方程一样的思想,,掌握了这种思想,以后再接题目的时候就可以得心应手了,所以自己一定要掌握的灵活自如才能真正的学号ACM.

我总是给嘉豪说(我的家教对象),如果你不用心,效率的学习,就跟没有学习过一样,那样的话,我们还不如一起去玩呢? 你觉得呢?

这句话,用在我身上又有何不可呢???

贴出这个代码.我自己理解,自己写出来的,不知道怎么样.一会还得去观摩一下别人dp都是怎么写的,然后再转化成自己的东西.

 

PS:我刚刚去看别人的代码的时候顺便也把别的打印出最长公共子序列的代码也看了看,觉得很棒!

然后自己就写了些..大家可以参考参考也呵呵.

我也举得如果吧所有的最长公共子序列都求出来的话,

我想就是扫描后面的几个dp[][]点,然后判断是不是dp[][]的值是不是最大值,如果是,就继续进行咱们的打印就行了,也没实现,,一会我在实现实现 呵呵.

在后面写出了 我的打印代码了,,大家可以去看看.

贴出代码:

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

char str1[1005],str2[1005];

int dp[1005][1005];

int max(int a,int b)
{
return a>=b?a:b;
}

int main()
{
str1[0]='#';//天那,为什么不加这个不行呢?
str2[0]='#';//以前也看到过,别人加这个东西,还以为不是那么重要的,但是这次不加会错,我就彻底悔悟了
while(scanf("%s%s",str1+1,str2+1)!=EOF)
{
int n=strlen(str1)-1;
int m=strlen(str2)-1;
for(int i=0;i<=n;i++)
dp[i][0]=0;
for(int j=0;j<=m;j++)
dp[0][j]=0;
int t=-1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(str1[i]==str2[j])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
if(t<dp[i][j])
t=dp[i][j];
}
}
printf("%d\n",t);
}
return 0;
}

 

 

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

char str1[1005],str2[1005];

int dp[1005][1005];

int index[1005][1005];

char idx[1005];

int max(int a,int b)
{
return a>=b?a:b;
}

int main()
{
memset(index,0,sizeof(index));
str1[0]='#';//天那,为什么不加这个不行呢?
str2[0]='#';//以前也看到过,别人加这个东西,还以为不是那么重要的,但是这次不加会错,我就彻底悔悟了
while(scanf("%s%s",str1+1,str2+1)!=EOF)
{
int n=strlen(str1)-1;
int m=strlen(str2)-1;
for(int i=0;i<=n;i++)
dp[i][0]=0;
for(int j=0;j<=m;j++)
dp[0][j]=0;
//int t=-1;
for(i=1;i<=n;i++)
{
for(j=1;j<=m;j++)
{
if(str1[i]==str2[j])
{
dp[i][j]=dp[i-1][j-1]+1;
index[i][j]=1;//  对角线移动;
}
else if(dp[i-1][j]>dp[i][j-1])
{
dp[i][j]=dp[i-1][j];
index[i][j]=2;//  向上移动;
}
else
{
dp[i][j]=dp[i][j-1];
index[i][j]=3;//  向左移动;
}
}
}
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
printf("%d ",dp[i][j]);
}
printf("\n");
}
printf("___________\n");
for(i=0;i<=n;i++)
{
for(j=0;j<=m;j++)
{
printf("%d ",index[i][j]);
}
printf("\n");
}
printf("%d\n",dp
[m]);
int len=dp
[m];
int temp=0;
i=n;
j=m;
while(len)
{
if(index[i][j]==1)
{
idx[temp++]=str1[i];
i--;
j--;
len--;
}
else if(index[i][j]==2)
i--;
else
j--;
}
for(i=temp-1;i>=0;i--)
printf("%c ",idx[i]);
printf("\n");
}
return 0;
}


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  c