【2错笔记】psd面试——最长回文子序列

原题传送

psd面试——最长回文子序列


再错分析:

哎,飘了飘了,再次刷的时候犯了四个究极致命的硬伤,一个是审题原因,因为已经了然于心,算法也懂,题目又太长了就没有认真去读,忘记“忽略大小写”这个条件了。

第二个犯的错误简直不能原谅啊!刚刚写完string的总结,转眼就忘了strlen函数的特性,因为一开始就预留了一行和一列防止数组越界。这是我一开始信心满满的代码(全是坑):当然是什么测试点都通过不了啦。

第三个错误是忘记了有多组数据的输入…(无语到我不知道该说些什么,我真垃圾)

第四个错误是老朋友了,忘记归零操作。

错误代码:

#include 
using namespace std;
#define jl 1500
int dp[jl][jl];
char psd[jl];
char reverse_psd[jl];

int main()
{
	scanf ( "%s", psd+1 );
	
	int len = strlen(psd);
	int i,j;
	for ( i=1; i<=len; i++ )
		reverse_psd[i] = psd[len-i+1];
	
	for ( i=1; i<=len; i++ )
		for ( j=1; j<=len; j++ )
		{
			if ( reverse_psd[i] == psd[j] )
				dp[i][j] = dp[i-1][j-1] + 1;
			else
				dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
		}
	
	int max = 0;
	for ( i=1; i<=len; i++ )
		for ( j=1; j<=len; j++ )
			if ( dp[i][j] > max )	max = dp[i][j]; 
			
	cout << len-max << endl;

}

再次AC代码:

#include 
using namespace std;
#define jl 1500
int dp[jl][jl];
char psd[jl];
char reverse_psd[jl];

void conversion(char *s,int len)
{
	int k;
	for ( k=1; k<=len; k++ )
		if ( s[k] >= 'A' && s[k] <= 'Z' )
			s[k]+=32;
}

int main()
{
	while ( ~scanf ( "%s", psd+1 ) )
	{
		int len = strlen(psd+1);
	

		conversion(psd,len);
		
		int i,j;
		for ( i=1; i<=len; i++ )
			reverse_psd[i] = psd[len-i+1];
		
		memset ( dp,0,sizeof(dp) );
		for ( i=1; i<=len; i++ )
			for ( j=1; j<=len; j++ )
			{
				if ( reverse_psd[i] == psd[j] )
					dp[i][j] = dp[i-1][j-1] + 1;
				else
					dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
			}
		
		//这个地方多余了 最长子串才要找最大值 这个最右下角的数值一定是最大的
		int max = 0;
		for ( i=1; i<=len; i++ )
			for ( j=1; j<=len; j++ )
				if ( dp[i][j] > max )	max = dp[i][j]; 
				
		cout << len-max << endl;
		memset ( psd, 0, sizeof(psd) );
		memset ( reverse_psd, 0, sizeof(reverse_psd) );
	}
	
	return 0;

}

你可能感兴趣的:(刷题笔记,#,二级讲解)