89pts求助,#8WA
查看原帖
89pts求助,#8WA
1251722
quantum_MilkyWay楼主2024/7/28 15:00
#include<iostream>
#include<map>
#include<vector>
using namespace std;
const int N = 505, INF = 0x7fffffff;
int n, k, ary[N], sum[N];
vector<int>checkpoint;
map<pair<int, pair<int, int>>, int>mp;
pair<int, pair<int, int>>mkp(int a, int b, int c) { return make_pair(a, make_pair(b, c)); }
int dfs(int pos, int lk, int prelk)
{
	if (mp[mkp(pos, lk, prelk)])return mp[mkp(pos, lk, prelk)];
	if (pos == n)return mp[mkp(pos, lk, prelk)] = (sum[pos] - sum[prelk]);
	int res = INF;
	if (lk > 0)res = min(res, max(dfs(pos + 1, lk - 1, pos), sum[pos] - sum[prelk]));//打断点。
	res = min(res, dfs(pos + 1, lk, prelk));//不打。
	return mp[mkp(pos, lk, prelk)] = res;
}
void getzt(int pos, int lk, int prelk)
{
	if (pos == n)return;
	int a = dfs(pos + 1, lk - 1, pos);
	int b = dfs(pos + 1, lk, prelk);
	if (a <= b)
	{
		checkpoint.push_back(pos);
		getzt(pos + 1, lk - 1, pos);
	}
	else getzt(pos + 1, lk, prelk);
}
int main()
{
	cin >> n >> k;
	k--;
	for (int i = 1;i <= n;i++)cin >> ary[i];
	for (int i = 1;i <= n;i++)sum[i] = sum[i - 1] + ary[i];
	dfs(1, k, 0);
	getzt(1, k, 0);
	checkpoint.insert(checkpoint.begin(), 0);
	checkpoint.push_back(n);
	for (int i = 1;i < checkpoint.size();i++)cout << checkpoint[i - 1] + 1 << " " << checkpoint[i] << endl;

	return 0;
}
2024/7/28 15:00
加载中...