完善程序(第二题):石子合并(区间 DP)

bt601393 组合题 共 个子题

(石子合并)有 n 堆石子排成一排,第 i 堆有 a[i] 个石子。每次可以合并相邻的两堆,合并的代价为这两堆石子数之和。求把所有石子合并成一堆的最小总代价。保证 1 ≤ n ≤ 300,0 ≤ a[i] ≤ 10000。

以下代码用区间 DP 求解,f[l][r] 表示把第 l 堆到第 r 堆合并成一堆的最小代价。试补全程序。

#include <algorithm>
#include <cstdio>
#include <cstring>
using namespace std;

const int MAXN = 305;
int a[MAXN], sum[MAXN];
int f[MAXN][MAXN];

int main() {
    int n;
    scanf("%d", &n);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
        sum[i] = sum[i - 1] + a[i];
    }
    ___①___;
    for (int i = 1; i <= n; ++i) f[i][i] = ___②___;
    ___③___
        for (int l = 1; l + len - 1 <= n; ++l) {
            int r = l + len - 1;
            for (int k = l; k < r; ++k)
                f[l][r] = ___④___;
        }
    printf("%d\n", ___⑤___);
    return 0;
}

子题 单选题

①处应填( )

A

memset(f, 0x3f, sizeof(f));

B

memset(f, 0, sizeof(f));

C

memset(f, 0xff, sizeof(f));

D

memset(f, 0x80, sizeof(f));

子题 单选题

②处应填( )

A

0x3f3f3f3f

B

a[i]

C

-1

D

0

子题 单选题

③处应填( )

A

for (int len = 3; len <= n; ++len)

B

for (int len = 2; len <= n; ++len)

C

for (int len = 2; len <= n - 1; ++len)

D

for (int len = n; len <= n; ++len)

子题 单选题

④处应填( )

A

max(f[l][r], f[l][k] + f[k+1][r] + sum[r] - sum[l-1])

B

min(f[l][r], f[l][k] + f[k+1][r])

C

min(f[l][r], f[l][k+1] + f[k][r] + sum[r] - sum[l-1])

D

min(f[l][r], f[l][k] + f[k+1][r] + sum[r] - sum[l-1])

子题 单选题

⑤处应填( )

A

f[n][1]

B

f[1][n-1]

C

f[1][n]

D

f[1][1]

正在加载题目数据…
已答 /
子题
该题型需在试卷/作业中作答,单题练习暂不支持
答案解析
讨论
发布
登录后参与讨论 立即登录
发布讨论需先绑定并验证手机号 去绑定手机号
加载中…
我
我
回复 @
回复 @
发送
还没有人讨论,来发表第一条吧