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这个关键字)。

相关文章
相关标签/搜索