[3-3]石の合併

「問題の説明:
円形遊び場の周りに配置された石は、nを積ま。ストーンパイルにマージするために持っていることです。時間規定の
石の新しい山、石の山と組み合わせたスコアのためにいくつかの新しいレコードに隣接する二つの山を選択することができます。試験設計1つ
のnを計算するアルゴリズムは、最小スコアと最大スコア重ね石の山に合わせ。
「プログラミングタスク:
N所与砂利パイルの場合、最小値と最大スコアのスコアを計算するプログラムされたパイルに合流。
「入力データ:
入力データファイルINPUT.TXTで提供。ファイルの最初の行は、正の整数n、1£nは£100であり、nが重ね石を表します。
第二行は、それぞれ、n個の数を有している、石の各山の数を表します。
「出力結果:
実行の終わりには、ファイルoutput.txtとに計算結果を出力します。最初のファイルの行数が最小利用可能である
パーティション、行の2番目の数字は最大スコアである;.
サンプル出力ファイル入力ファイルの例
output.txtとINPUT.TXT
。4
。4. 5. 4. 9
43は、
54であります

[説明]


F1 [I] [j]は長さの開始を示し、Iは、スキームスコア結合jは最適の
方式を組み合わせるJ最悪スコアからF2を[I] [j]は長さの開始を示し、Iは、
ロックビットレンジ拡張ので、ループとして、N + 1..2 * N個まで延び
列挙長、開始列挙、列挙ブレークポイント。
DPは、やりたいです

[コード]

/*
    f1[i][j]表示从i开始长度为j的最佳合并方案得分
    f2[i][j]表示从i开始长度为j的最差合并方案得分
*/
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int N = 100;
const int M = 1e4;

int n, s;
int f1[2*N + 10][N + 10], f2[2*N + 10][N + 10];
int a[2 * N + 10];

int main() {
    //freopen("C://Users//Administrator//Desktop//测试数据//ch3//prog33//test//merge8.in","r",stdin);
    cin >> n;
    for (int i = 1; i <= n; i++) cin >> a[i];
    for (int i = 1; i <= n; i++) a[i + n] = a[i];
    for (int i = 1; i <= 2 * n; i++) a[i] = a[i] + a[i - 1];
    for (int i = 1; i <= 2 * n; i++) {
        f1[i][1] = f2[i][1] = 0;
    }
    for (int l = 2; l <= n; l++) {
        for (int i = 1; i <= 2 * n; i++) {
            int j = i + l - 1;
            if (j > 2 * n) break;
            f1[i][l] = f1[i][1] + f1[i + 1][l - 1] + a[j] - a[i - 1];
            f2[i][l] = f2[i][1] + f2[i + 1][l - 1] + a[j] - a[i - 1];
            for (int k = 2; k <= l - 1; k++) {
                f1[i][l] = max(f1[i][l], f1[i][k] + f1[i + k][l - k] + a[j] - a[i - 1]);
                f2[i][l] = min(f2[i][l], f2[i][k] + f2[i + k][l - k] + a[j] - a[i - 1]);
            }
        }
    }
    int ma = f1[1][n], mi = f2[1][n];
    for (int i = 2; i <= n; i++)
    {
        ma = max(ma, f1[i][n]);
        mi = min(mi, f2[i][n]);
    }
    cout << mi << endl;
    cout << ma << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/AWCXV/p/11665382.html