关闭

石子合并问题

218人阅读 评论(0) 收藏 举报
分类:
#include "iostream"
#include "algorithm"
#include "fstream"
using namespace std;

/*
参考:http://blog.csdn.net/lyflower/article/details/2150239

minc[i,j]表示将石子i堆到j堆合并的最小得分
maxc[i,j]表时将石子i堆到j堆合并的最大得分
minc[i][j] = min{minc[i][k] + minc[k+1][j] + totalValue(i,j)} i<=k<j
*/

int minc[100][100];
int maxc[100][100];
int a[50];  //每堆石子个数

int total(int i, int j)
{
    return a[j] - a[i-1];
}

int minCost(int n)
{
    memset(minc, 0, sizeof(minc));
    for(int r=2; r<=n; r++)  //问题规模
        for(int i=1; i<=n-r+1; i++)  //区间左端点
        {
            int j = i + r - 1;  //区间右端点
            minc[i][j] = minc[i][i] + minc[i+1][j]; //初始值
            for(int k=i+1; k<j; k++)
            {
                int temp = minc[i][k] + minc[k+1][j];
                if(minc[i][j] > temp)
                    minc[i][j] = temp;
            }
            minc[i][j] += total(i, j);
        }

    //因为是圆排列,所以需要寻找最佳解
    n = (n+1)/2;
    int best = minc[1][n];
    for(int i=2; i<n; i++)
        if(minc[i][i+n-1] && minc[i][i+n-1] < best)
            best = minc[i][i+n-1];
    return best;
}

int max(int a, int b)
{
    return a>b? a:b;
}

int maxCost(int n)
{
    memset(maxc, 0, sizeof(maxc));
    for(int r=2; r<=n; r++)  //问题规模
        for(int i=1; i<=n-r+1; i++)  //区间左端点
        {
            int j = i + r - 1;  //区间右端点
            maxc[i][j] = maxc[i][i] + maxc[i+1][j]; //初始值
            for(int k=i+1; k<j; k++)
            {
                int temp = maxc[i][k] + maxc[k+1][j];
                if(maxc[i][j] < temp)
                    maxc[i][j] = temp;
            }
            maxc[i][j] += total(i, j);
        }

    //因为是圆排列,所以需要寻找最佳解
    n = (n+1)/2;
    int best = maxc[1][n];
    for(int i=2; i<n; i++)
        if(minc[i][i+n-1] && maxc[i][i+n-1] > best)
            best = maxc[i][i+n-1];
    return best;
}

int main()
{
    ifstream fin("stone.txt");
    int n;
    cout  << "输入石子堆数:";
    fin >> n;  cout << n;
    cout << "\n输入各堆中石子数量:\n";
    for(int i=1; i<=n; i++)
    {
        fin >> a[i];
        a[n+i] = a[i];
        cout << a[i] << " ";
    }

    for(i=2; i<=2*n; i++)
        a[i] += a[i-1];

    cout << "\n最小得分:" << minCost(2*n) << endl;
    cout << "最大得分:" << maxCost(2*n) << endl;
    fin.close();
    return 0;
} 

这里写图片描述

0
0
查看评论
发表评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场

石子合并问题

石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆石子合并...
  • ACdreamers
  • ACdreamers
  • 2014-01-09 14:33
  • 33517

算法_动态规划_石子合并问题

问题描述: 在一个圆形操场的四周摆放着n 堆石子。现要将石子有次序地合并成一堆。 规定每次只能选相邻的2 堆石子合并成新的一堆,并将新的一堆石子数记为该次合并的得分。 试设计一个算法,计算出将n...
  • huangxiang360729
  • huangxiang360729
  • 2016-04-11 19:26
  • 1874

Hrbust 1818 石子合并问题--直线版【区间dp】

石子合并问题--直线版 Time Limit: 1000 MS Memory Limit: 32768 K Total Submit: 66(34...
  • mengxiang000000
  • mengxiang000000
  • 2016-08-10 13:33
  • 521

石子合并问题--动态规划;贪心

石子合并问题石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将这N堆...
  • gatieme
  • gatieme
  • 2015-10-17 20:18
  • 5514

南邮 OJ 1225 石子合并问题

石子合并问题 时间限制(普通/Java) : 1000 MS/ 3000 MS          运行内存限制 : 65536 KByte 总提交 : 151     &#...
  • changshu1
  • changshu1
  • 2015-08-05 11:22
  • 491

石子合并(GarsiaWachs算法)

对于石子合并问题,有一个最好的算法,那就是GarsiaWachs算法。时间复杂度为O(n^2)。 它的步骤如下: 设序列是stone[],从左往右,找一个满足stone[k-1] stone[k...
  • ACdreamers
  • ACdreamers
  • 2014-01-09 17:14
  • 6764

石子合并问题3种题型

石子合并问题是最经典的DP问题。首先它有如下3种题型: (1)有N堆石子,现要将石子有序的合并成一堆,规定如下:每次只能移动任意的2堆石子合并,合并花费为新合成的一堆石子的数量。求将...
  • briup_acmer
  • briup_acmer
  • 2015-01-14 10:50
  • 667

合并类动态规划,石子归并,合并石子解题报告

设有N堆沙子排成一排,其编号为1,2,3,…,N(N<=100)。每堆沙子有一定的数量。现要将N堆沙子并成为一堆。归并的过程只能每次将相邻的两堆沙子堆成一堆,这样经过N-1次归并后成为一堆。找出一种合...
  • txl16211
  • txl16211
  • 2014-10-30 19:47
  • 5898

石子合并——圆形版

石子合并——圆形版 一个较为常规的dp,用上了环的处理。
  • G_congratulation
  • G_congratulation
  • 2016-07-08 20:26
  • 799

区间DP入门之 石子归并问题

题目描述:有N堆石子排成一排,每堆石子有一定的数量。现要将N堆石子并成为一堆。合并的过程只能每次将相邻的两堆石子堆成一堆,每次合并花费的代价为这两堆石子的和,经过N-1次合并后成为一堆。求出总的代价最...
  • wuxuanyi27
  • wuxuanyi27
  • 2016-04-21 21:40
  • 847
    个人资料
    • 访问:361390次
    • 积分:11508
    • 等级:
    • 排名:第1544名
    • 原创:815篇
    • 转载:47篇
    • 译文:4篇
    • 评论:124条
    最新评论