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