POJ1159解題心得

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

相關文章
相關標籤/搜索