poj 1159

不得不说本人愚盹,动态规划的题也做了不少,但就是不得要领。

此题 实质上是求最长公共子串,最长公共字串的dp解法想了半天想不出来,只能看百度百科了http://baike.baidu.com/view/2020307.htm

题目描述:http://poj.org/problem?id=1159

求完公共子串长度,然后用总长度一减即是结果

没用滚动数组,short 水过

代码:

#include <stdio.h>
#include <stdlib.h>
short maxS(short a,short b)
{
return a>b?a:b;
}
short dp[5002][5002];
char a[5002];
int main(int argc, char** argv) {

short n,i,j,len;

scanf("%d",&n);

getchar();
for(i=1;i<=n;++i)
{
scanf("%c",&a[i]);
}
//getchar();
memset(dp,0,sizeof(dp));
for(i=0;i<=n;++i)
{
dp[i][0]=0;
dp[0][i]=0;
}
for(i=1;i<=n;++i)
{
for(j=n;j>=1;--j)
{

if(a[i]==a[j])
{
dp[i][n-j+1]=dp[i-1][n-j]+1;
}
else
{
dp[i][n-j+1]=maxS(dp[i][n-j],dp[i-1][n-j+1]);
}
}
}
printf("%d\n",n-dp[n][n]);

return (EXIT_SUCCESS);
}



原文地址:https://www.cnblogs.com/fengyuehan/p/poj1159.html