POJ1050 LCS变体,二维数组DP

来源:互联网 发布:笔记本软件限制策略 编辑:程序博客网 时间:2024/05/22 22:16

琢磨这个题琢磨了一下午,看了网上好多的代码都没写注释,也没看懂,最后找到了一个写的很清楚的

http://blog.sina.com.cn/s/blog_695800d10100q6as.html

总体来说这个题求矩阵的dp,思路就是在每次循环中将每列叠加起来形成一个1行n列的数组,在对这个数组求最大连续值。获得结果更新最大值。现在结合代码说一下:

////  main.cpp//  POJ1050////  Created by dan on 16/9/17.//  Copyright © 2016年 dan. All rights reserved.//#include <iostream>#include <string.h>#include <string>#include <stdio.h>using namespace std;#define MAXN 1000int a[MAXN][MAXN];int b[MAXN];//这个是求一维数组最大连续值的函数,注意的是每次判定的是当前的sum值,而不是b[i]值。int getMax(int n){    int nmax = -999;    int sum = 0;    for (int i = 0; i < n; i++)    {        if (sum > 0)            sum += b[i];        else            sum = b[i];        nmax = max(nmax, sum);    }    return nmax;}int dp(int n){    int ans = 0;    for (int i = 0; i < n; i++){        memset(b, 0, sizeof(b));        for (int j = i; j < n; j++){        //i表示行的循环,j代表从第i行开始,向下进行合并。        //比如n == 4, i == 0时。j从范围[0,3],将每一行的值        //放进数组b中,b[k]代表第j行k列所有元素的和。        //之后对b求最大连续数字和,更新结果。            for(int k = 0; k < n; k++){                b[k] += a[j][k];            }            ans = max(ans, getMax(n));        }    }    return ans;}int main(int argc, const char * argv[]) {    int n;    while(cin >> n){        for(int i = 0; i < n; i++){            for(int j = 0; j < n; j++){                cin >>a[i][j];            }        }        cout << dp(n) << endl;;    }}
0 0
原创粉丝点击