社区讨论

区间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 条回复,欢迎继续交流。

正在加载回复...