题目:
刚开始,从样例的特征去思考。总让我从回文数的角度去思考,想出几个方案,可都用了数据去检验,发现不行。如:ABCDDCB,BACDCABD等样例。
然后,思考半天,没想出可行的方案。于是,看人家的解题报告,发现如下公式:
此题所需的解 = 原字符串的长度 — 原字符串和逆字符串的最长公共子序列的长度
于是,啪啦啪啦把代码写完,测试,没问题。提交,发现,Rumtime Error。发现错误,动态规划的数组开辟空间过大,放在函数里面,把它放到函数外就OK了。然后,再次提交,发现,Memory Limit Exceed。解决办法,把动态规划的dp数组压缩空间,变成滚动数组。于是,AC代码就变成如下的样子了。
#include#include #include #include using namespace std;#define INF 88888888#define MAX_N 5000int length;char originalStr[MAX_N + 1];int dp[2][MAX_N + 1];//dp[i % 2][j]:=s1...si和s1...sj的LCS的长度void inputTestData(){ cin >> length; for(int i=0;i > originalStr[i]; }}char* reverseStr(char* str,int length){ char* p = (char*)malloc(sizeof(char) * length); for(int i=0;i
附:使用C/C++出现Runtime Error的情况,基本都是如下原因:
1.数组越界;(本质上还是第二个原因)
2.访问没有权限访问的内容,即没有为指针分配足够的空间;
3.指针的值是NULL,即常说的“空指针”。
如果语言是Java,出现任何Exception或Error都会得到Runtime Error的结果。
常见的Exception或Error:
空指针异常,数组越界异常,类型转换异常,除0异常。
栈溢出错误(通常由无穷递归引起,也可能是方法内开辟的数组空间过大),断言错误(由于OJ无法看到错误栈的信息,所以,在算法竞赛中,不要用assert这个关键字)。