动态规划求不相邻的最大子数组和
来源:互联网 发布:nginx 安全加固 编辑:程序博客网 时间:2024/04/29 15:24
原创文章,转载请注明!
问题:给出一个数组,求出其中一个子集,使得子集中每个元素在原数组中两两都不相邻并使子集的和最大。
思路:先找到最优子结构,对于数组A[0...n],设r[i][j]为A[i][j]的不相邻最大子数组和,则有
r[i][j] =
max(A[i][j],0) i = j
max(r[i][k-1]+r[k-1][j]) i < j, k = i~j 注意k = i or j时,有点特殊,代码中可以看出来
#include <iostream>#include <stdlib.h>using namespace std;#define MIN -1000000int MaxSum(int *A, int len){int **r = new int* [len];for(int i = 0; i < len; i++)r[i] = new int [len];for (int i = 0; i < len; i++)r[i][i] = A[i] > 0 ? A[i] : 0;int l, i, j, k;for (l = 2; l <= len; l++){for(i = 0; i < len - l + 1; i++){j = l + i - 1;int temp = MIN;for(k = i; k <= j; k++){if (k == i)temp = temp > r[k + 1][j] ? temp : r[k + 1][j];else if (k == j)temp = temp > r[i][k - 1] ? temp : r[i][k - 1];else {int q;q = r[i][k - 1] + r[k + 1][j];temp = temp > q ? temp : q;}}r[i][j] = temp;}}int maxsum = r[0][len - 1];for (int n = 0; n < len; n++)delete[] r[n];delete[] r;return maxsum;}int main(){int A[] = {-1,3,4};int len = sizeof(A) / sizeof(int);cout<<MaxSum(A, len)<<endl;system("pause");}
0 0
- 动态规划求不相邻的最大子数组和
- 动态规划求不相邻的最大子数组和
- 动态规划求不相邻的最大子数组和
- 求不相邻的最大子数组和
- 不相邻的最大子数组和
- 【动态规划】求数组最大的子数组连续和
- 动态规划:求子数组的最大连续和
- 求最大子数组的和(动态规划法)
- 【动态规划】之求连续子数组的最大和
- 动态规划求最大子数组的和
- House Robber 非负数组,相邻不能相加,求最大的和是多少(动态规划)
- 利用动态规划求连续数组最大和以及最大子矩阵的和
- 动态规划算法 (微软笔试题,求连续子数组的最大和)
- 求数组的最大子段和,动态规划 时间复杂度O(n)
- java如何求最大子数组的和 蛮力算法 动态规划算法
- 【大白话版】求最大和子数组的动态规划算法
- 动态规划-循环数组的最大子数组和
- 动态规划求最大子段和
- chmod----改变一个或多个文件的存取模式(mode)
- 关闭selinux和防火墙开启状态增加3306端口
- mysql 主从复制集群搭建
- 职场分享--职场中如何锻炼自己的交际能力
- cmake的安装编译
- 动态规划求不相邻的最大子数组和
- mysql 主从同步集群搭建(二)mysql5.5.25版本
- 循环渐进学习mysql(1)
- Cocos2D-X设计模式:中介者模式
- linux下安装JDK1.7
- linux下安装tomcat7.0
- rabbitmq 在centos下的安装(实战)
- mongodb性能优化
- mongodb中的数据建模