長度至少爲m的最小連續子序和

題意:

有一個長度爲 n 的整數序列,它有很多子序列滿足兩個條件:(1)該子序列長度至少爲 m;(2) 該子序列是連續的。找到這些子序列中元素之和最小的那個子序列,輸出它的元素之和。

代碼:

#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
int
 minSubordinateSum(vector<int> &nums, int m)
{
	int size = nums.size();
	if (size < m || size <= 0)
		throw "error";

	int minSum = 0;
	for (int i = 0; i < m; ++i)
		minSum += nums[i];

	int len = size - m + 1;
	vector<vector<int>> dp(len, vector<int>(len));
	dp[0][0] = minSum;

	for (int i = m, j = 1; i < size; ++i, ++j)
	{
		dp[0][j] = minSum + nums[i] - nums[i - m];
		minSum = min(minSum, dp[0][j]);
	}

	for (int i = 1; i < len; ++i)
	{
		for (int j = 0; j < len - i; ++j)
		{
			dp[i][j] = dp[i - 1][j] + nums[j+m];
			minSum = min(minSum, dp[i][j]);
		}
	}

	return minSum;
}

void test2()
{
	int n, m;
	cin >> n >> m;
	vector<int>nums(n);
	for (size_t i = 0; i < nums.size(); ++i)
		cin >> nums[i];
	cout << minSubordinateSum(nums, m);
}

int main()
{
	test2();

	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章