poj1159

来源:互联网 发布:wind中国金融数据库 编辑:程序博客网 时间:2024/06/05 16:41

动态规划

刚开始时稍稍没有头绪,但认真想的话这个题还是求最长公共子序列上。所有的代码围绕数据的如何存储展开的,数据的如何存储决定了以后如何对数据的操作,同时复杂度的大小,本题使用滚动数组,这也和动态规划的性质有关,此时的状态只与前一个状态有关,而与更前的状态无关,故只设置动态二维数组时,只设两个行即可,用%2来进行滚动。状态方程确立好。

#include <iostream>#include <memory.h>using namespace std;int max(int a,int b){    if(a >= b)    return a;    else    return b;}int main(){    int n;    while(cin >> n)    {        char *s1 = new char[n+1];        char *s2 = new char[n+1];        int **p = new int*[n+1];        p[0] = new int[n + 1];        p[1] = new int[n + 1];        p[0][0] = p[1][0] = 0;        for(int i = 1;i <= n;i ++)        {            p[0][i] = p[1][i] = 0;            char temp;            cin >> temp;            s1[i] = s2[n + 1 - i] = temp;        }        int length = -1;        for(int i = 1;i <= n;i ++)        for(int j = 1;j <= n;j ++)        {            if(s1[i] == s2[j])  p[i%2][j] = p[(i-1)%2][j-1] + 1;            else  p[i%2][j] = max(p[(i-1)%2][j],p[i%2][j-1]);            if(length < p[i%2][j])            length = p[i%2][j];        }        cout << n - length << endl;        delete s1;        delete s2;        delete []p;    }    return 0;}


0 0
原创粉丝点击