您的位置:首页 > 其它

南阳理工OJ_题目737 石子合并(一)

2014-05-08 21:15 218 查看
//和矩阵连乘一样 
#include <iostream>
#include <cstring>

using namespace std;

int dp();
void fun();

int a[210];
int d[210][210];
int sum[210][210];
int n;

int main()
{
    while(cin >> n)
    {
        for(int i = 1; i <= n; i++)
        {
            cin >> a[i];
            sum[i][i] = a[i];
        }

        memset(d, 0x7f, sizeof(d));
        fun();
        for(int i = 1; i <= n; i++)
            d[i][i] = 0;
        cout << dp() << endl;
    }
}

int dp()
{
    for(int k = 2; k <= n; k++)
    {
        for(int i = 1; i <= n-k+1; i++)
        {
            int j = i+k-1;
            for(int l = i; l < j; l++)
                d[i][j] = min(d[i][l] + d[l+1][j] + sum[i][j], d[i][j]);
        }
    }
    return d[1]
;
}

void fun()
{
    for(int i = 1; i <= n; i++)
        for(int j = i + 1; j <= n; j++)
            sum[i][j] = sum[i][j-1]+a[j];
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: