最小m段和

本文介绍了一个使用 C++ 实现的动态规划算法,该算法旨在解决一个特定的子序列和问题。通过对给定数组进行处理,算法能够找出满足条件的最大子序列和的最小值。代码中详细展示了如何分配和初始化动态规划数组,并通过嵌套循环来更新这些值以找到最优解。
#include <iostream>
using namespace std;
int main(){
	int n = 9;
	int m = 3;
	int arr[] = { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
	int **r = new int*[n];
	for (int i = 0; i < n; i++){
		r[i] = new int[m]();
	}
	r[0][0] = arr[0];
	for (int i = 1; i < n; i++){
		r[i][0] = r[i-1][0] + arr[i];
	}
	for (int i = 1; i < m; i++){
		r[i][i] = arr[i];
	}
	
	//数组处理
	for (int j = 1; j < m; j++){
		
		for (int i = j+1; i < n; i++){
			int min = INT_MAX;
			int max = 0;
			for (int k = j; k < i; k++){
				max = (r[i][0] - r[k][0])>r[k][j - 1] ? (r[i][0] - r[k][0]) : r[k][j - 1];
				//让主序列和达到最大值,左边(r[i][0] - r[k][0])的是从k个到i的序列分成一组,右边r[k][j - 1]的是前k个序列分成j-1组;
				min = min < max ? min : max;
			}
			r[i][j] = min;
		}
	}



	for (int i = 0; i < n; i++){
		for (int j = 0; j < m; j++){
			cout << r[i][j] << "    ";
		}
		cout << endl;
	}
	cout << endl;
	cout << "子序列和最大值的最小值为:" << r[n - 1][m - 1] << endl;
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值