社区讨论
区间dp 满江红中一点绿 蒟蒻求调
P1880[NOI1995] 石子合并参与者 2已保存回复 3
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 3 条
- 当前快照
- 1 份
- 快照标识符
- @lo2sq2iu
- 此快照首次捕获于
- 2023/10/23 19:10 2 年前
- 此快照最后确认于
- 2023/10/23 19:10 2 年前
CPP
#include <iostream>
#include <cstring>
using namespace std;
int total;
int rock[1050];
int sum[1050];
int dp[1050][1050];
int dp_1[1050][1050];
int main()
{
cin >> total;
for (int i = 1; i <= total; i++)
{
cin >> rock[i];
sum[i] = rock[i] + sum[i - 1];
rock[i + total] = rock[i];
}
for (int i = total + 1; i <= total * 2; i++)
{
sum[i] = rock[i] + sum[i - 1];
}
for (int len = 2; len <= total; len++)
{
for (int left = 1; left + len - 1 <= total * 2; left++)
{
int right = left + len - 1;
for (int k = left; k < right; k++)
{
if (dp[left][right] == 0)
{
dp[left][right] = dp[left][k] + dp[k + 1][right] + sum[right] - sum[left - 1];
}
else
{
dp[left][right] = min(dp[left][right], dp[left][k] + dp[k + 1][right] + sum[right] - sum[left - 1]);
}
}
}
}
for (int len = 2; len <= total; len++)
{
for (int left = 1; left + len - 1 <= total * 2; left++)
{
int right = left + len - 1;
for (int k = left; k < right; k++)
{
if (dp_1[left][right] == 0)
{
dp_1[left][right] = dp_1[left][k] + dp_1[k + 1][right] + sum[right] - sum[left - 1];
}
else
{
dp_1[left][right] = max(dp_1[left][right], dp_1[left][k] + dp_1[k + 1][right] + sum[right] - sum[left - 1]);
}
}
}
}
int res = 0x3f;
int res_1 = 0;
for (int i = 1; i <= total + 1; i++)
{
res = min(res, dp[i][i + total - 1]);
res_1 = max(res_1, dp_1[i][i + total - 1]);
}
cout << res << endl;
cout << res_1 << endl;
return 0;
}
回复
共 3 条回复,欢迎继续交流。
正在加载回复...