POJ1050 LCS变体,二维数组DP

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

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 1000
int 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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值