題目: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這個關鍵字)。