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
- POJ1050 LCS变体,二维数组DP
- POJ-1080-Human Gene Functions-LCS变体,动态规划,DP
- POJ1050 DP
- POJ1050【DP】
- [DP] POJ1050
- POJ1050二维数组的最大子数组和
- poj1050-求二维数组子数组和的最大值
- poj1050 二维数组最大子序列矩阵和
- 二维数组的动态规划与LCS
- POJ1050 dp入门
- poj1050(DP)
- poj1050 二维最大字段和
- POJ 1159 Palindrome(DP LCS&滚动数组)
- poj1050 动态规划 求二维数组中子矩阵和的最大值
- hdu 1080 Human Gene Functions LCS变体
- DP::Poj1050 To the max
- poj1050 To the Max (dp)
- POJ1050 TO THE MAX [DP]
- Android URI
- 基于Fast Trackingvia Spatio-Temporal Context Learning目标跟踪所感
- 字符串的排列
- 在Drupal中使用Restful之二
- [转载]Qt 水平滚动字幕
- POJ1050 LCS变体,二维数组DP
- Opencv之实现图像修复intpaint()函数
- 堆,栈,方法区
- [数据结构]
- PHP文件上传、下载
- 最大下标距离
- adb sideload刷机教程
- vector<bool>
- imx6 项目的按键驱动程序