loj10147. 「一本通 5.1 例 1」石子合并

Posted junk-yao-blog

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了loj10147. 「一本通 5.1 例 1」石子合并相关的知识,希望对你有一定的参考价值。

思路:
  经典的区间dp,题解到处都是。。。

#include<cstdio>
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 1010;
inline void qread(int &x){
    x = 0;
    register int ch = getchar();
    while(ch < 0 || ch > 9)    ch = getchar();
    while(ch >= 0 && ch <= 9)    x = 10 * x + ch - 48, ch = getchar();
}
int f[maxn << 1][maxn << 1];
int g[maxn << 1][maxn << 1];
int sum[maxn];
int n;
int data[maxn << 1];
int main(void){
    qread(n);
    for(int i=1; i<=n; ++i){
        qread(data[i]);
        data[i+n] = data[i];
    }
    for(int i=1; i<=2*n-1; ++i)
        sum[i] = sum[i-1] + data[i];
    for(int L = 2; L <= n; ++L)
        for(int i = 1; i <= 2 * n - L + 1; ++i){
            int j = i + L - 1;
            f[i][j] = 0x3f3f3f3f;
            for(int k = i; k < j; ++k){
                f[i][j] = min(f[i][j], f[i][k] + f[k + 1][j]);
                g[i][j] = max(g[i][j], g[i][k] + g[k + 1][j]);
            }
            f[i][j] += sum[j] - sum[i-1];
            g[i][j] += sum[j] - sum[i-1];
        }
    int fans = 0x3f3f3f3f, gans = 0;
    for(int i=1; i<=n; ++i)    fans = min(fans, f[i][i + n -1]);
    for(int i=1; i<=n; ++i)    gans = max(gans, g[i][i + n -1]);
    printf("%d
%d
", fans, gans);        
}

 


以上是关于loj10147. 「一本通 5.1 例 1」石子合并的主要内容,如果未能解决你的问题,请参考以下文章

loj10150. 「一本通 5.1 练习 1」括号配对

loj10151. 「一本通 5.1 练习 2」分离与合体

loj10043. 「一本通 2.2 例 1」剪花布条

loj10143. 「一本通 4.6 例 1」营业额统计

loj10193. 「一本通 6.1 例 1」序列的第 k 个数

loj10164. 「一本通 5.3 例 2」数字游戏