POJ 1458 LCS 数组过小因编译器不同引发

按道理说LCS的问题应该讨论的很明白了,不应该出问题。昨天晚上手贱点开了暑期写的LCS滚动数组的代码。发现毫无逻辑错误。

但却是WA,用的C++,。于是随手换了个g++ 却手动把1-flag 与flag相比较输出最大,就AC

#include<stdio.h>
#include <math.h>
#include <string.h>
#define N 2000
char str1[N];
char str2[N];
int  dp[2][N];
int main()
{
   int i,j,n,m,flag;
   while(scanf("%s %s",str1,str2)!=EOF)
   {
	   memset(dp,0,sizeof(dp));
	   flag=1;
	   for(i=1;i<=strlen(str1);i++)
	   {

		   for(j=1;j<=strlen(str2);j++)
		   {
			   if(str1[i-1] == str2[j-1])
				   dp[flag][j]=dp[1-flag][j-1]+1;
			   else if(dp[flag][j-1]>dp[1-flag][j])
				   dp[flag][j]=dp[flag][j-1];
			   else
				   dp[flag][j]=dp[1-flag][j];
		   }
		   flag=1-flag;
	   }
	   printf("%d\n",dp[1-flag][j-1]);

   }
   return 0;
}

没想到是编译器的问题,依旧在纠结我的程序逻辑哪里有问题。使用了好几个方法去测试。

在这期间问了好多人,发现大家都是一个写的模板,很少思考各种不同之间的问题,包括一个大神。。。。。。总是用已经可以成功的方法套。都说这样写没错别想那个了。

1. 测试数据弄多点,每次输出两者,看什么情况下最优。//结果总是1-flag最优,说明这种思路没错。

2. 逆向分析,既然是最后两者判断输出最优,那么必然是两个数组中j-1这个位置的问题,那肯定是最后一个字符匹配成功才导致的(不成功就是复制flag的了)

但这逻辑上也是不同。。。。。

3. 在lj同学测试下,发现g++可以过

原来是数组开小了。。。。。。。。我擦,调了一晚上竟然这种结果,你要是re的话不早就好了???

C/C++不对内存越界检测,所以程序稀里糊涂越界,没被检测到。且g++ c++处理机制不同才导致。。。。

这个收获才是真多,,,,,,,

时间: 2024-10-19 16:13:26

POJ 1458 LCS 数组过小因编译器不同引发的相关文章

POJ 1458 LCS模板

LCS模板 存一个 #include "stdio.h" #include "string.h" int main() { char a[1010],b[1010]; int i,j,Max,dp[1010]; while (scanf("%s",a)!=EOF) { scanf("%s",b); memset(dp,0,sizeof(dp)); for (i=0;b[i];i++) { Max=0; for (j=0;a[j

Poj 1458 Common Subsequence(LCS)

Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there exists a strictly

POJ 1458 Common Subsequence (动态规划)

题目传送门 POJ 1458 Description A subsequence of a given sequence is the given sequence with some elements (possible none) left out. Given a sequence X = < x1, x2, ..., xm > another sequence Z = < z1, z2, ..., zk > is a subsequence of X if there ex

[2016-03-28][POJ][1458][Common Subsequence]

时间:2016-03-28 12:56:39 星期一 题目编号:[2016-03-28][POJ][1458][Common Subsequence] 题目大意:最长公共序列 #include <cstring> #include <iostream> #include <string> using namespace std; typedef long long LL; const int maxn = 1000 + 100; int dp[maxn][maxn];

{POJ}{树状数组}

总结一下树状数组的题目: {POJ}{3928}{Ping Pong} 非常好的题目,要求寻找一个数组中满足A[i]<A[k]<A[j]的个数,其中i<k<j(或者相反).很巧妙的将题目转化为树状数组的思想,从A[k]考虑,则只需要寻找左边比自己小和右边比自己大的可能性(或者相反),这样就可以用树状数组来维护.思想的转变很重要. {POJ}{1990}{MooFest} n头牛,不同的听力值v,当i,j想要通话时,需要max(v(i),v(j))*(dist[i]-dist[j])

POJ 2774 后缀数组:求最长公共子串

思路:其实很简单,就是两个字符串连接起来,中间用个特殊字符隔开,然后用后缀数组求最长公共前缀,然后不同在两个串中,并且最长的就是最长公共子串了. 注意的是:用第一个字符串来判断是不是在同一个字符中,刚开始用了第二个字符的长度来判断WA了2发才发现. #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<map> #include<

poj 3261 后缀数组 找重复出现k次的子串(子串可以重叠)

题目:http://poj.org/problem?id=3261 仍然是后缀数组的典型应用----后缀数组+lcp+二分 做的蛮顺的,1A 但是大部分时间是在调试代码,因为模板的全局变量用混了,而自己又忘了,,,等西安邀请赛还有四省赛结束之后,该冷静反思下尝试拜托模板了 错误   :1.k用错,题目的k和模板的k用混; 2.还是二分的C()函数,这个其实跟前一篇<poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题>的C函数

poj 3415 后缀数组分组+排序+并查集

Source Code Problem: 3415   User: wangyucheng Memory: 16492K   Time: 704MS Language: C++   Result: Accepted Source Code #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; #define N 510000

poj 1458 动态规划DP

//  poj 1458  zoj 1733  最长公共子序列  DP #include <iostream>#include <string.h>#define N 1005using namespace std ;char  s1[N],s2[N];   int dp[N][N];int max(int a,int b)   {    return a>b ? a : b ;  }void f(int n,int m){   int i,j;    for (i=0; i