solution.md 1.8 KB
Newer Older
每日一练社区's avatar
每日一练社区 已提交
1
# 超级胶水
F
fix bug  
feilong 已提交
2

每日一练社区's avatar
每日一练社区 已提交
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
小明有n颗石子,按顺序摆成一排。他准备用胶水将这些石子粘在一起。每颗石子有自己的重量,如果将两颗石子粘在一起,将合并成一颗新的石子,重量是这两颗石子的重量之和。  
为了保证石子粘贴牢固,粘贴两颗石子所需要的胶水与两颗石子的重量乘积成正比,本题不考虑物理单位,认为所需要的胶水在数值上等于两颗石子重量的乘积。  
每次合并,小明只能合并位置相邻的两颗石子,并将合并出的新石子放在原来的位置。  
现在,小明想用最少的胶水将所有石子粘在一起,请帮助小明计算最少需要多少胶水。  

测试样例

输入 
```
3 

3 4 5
```
输出
```
47
```

每日一练社区's avatar
每日一练社区 已提交
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
下面的代码实现了这一功能,请你补全空白处。

```cpp
const int maxn = 100005;

int numv[maxn];
int v[maxn];

int dfs(int idx)
{
    if (idx == 0)
        return 0;

    if (idx == 1)
        return v[0] * v[1];

    int max_, a = 0x3f3f3f, b = 0x3f3f3f3f, c = 0;
    if (idx >= 2)
        __________________
    b = v[idx] * numv[idx - 1] + dfs(idx - 1);
    c = min(a, b);
    return c;
}

int main()
{

    int n;
    scanf("%d", &n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &v[i]);
        if (i == 0)
            numv[i] = v[i];
        numv[i] = numv[i - 1] + v[i];
    }

    printf("%d", dfs(n - 1));
}
```
每日一练社区's avatar
每日一练社区 已提交
61 62

## aop
F
fix bug  
feilong 已提交
63

每日一练社区's avatar
每日一练社区 已提交
64
### before
F
fix bug  
feilong 已提交
65

每日一练社区's avatar
每日一练社区 已提交
66 67 68 69
```cpp
 
```
### after
F
fix bug  
feilong 已提交
70

每日一练社区's avatar
每日一练社区 已提交
71
```cpp
每日一练社区's avatar
每日一练社区 已提交
72

每日一练社区's avatar
每日一练社区 已提交
73 74 75
```

## 答案
F
fix bug  
feilong 已提交
76

每日一练社区's avatar
每日一练社区 已提交
77
```cpp
每日一练社区's avatar
每日一练社区 已提交
78
a = (v[idx] * v[idx - 1] + dfs(idx - 2) + numv[idx - 2] * (v[idx] + v[idx - 1]));
每日一练社区's avatar
每日一练社区 已提交
79 80 81
```
## 选项

F
fix bug  
feilong 已提交
82

每日一练社区's avatar
每日一练社区 已提交
83
### A
F
fix bug  
feilong 已提交
84

每日一练社区's avatar
每日一练社区 已提交
85
```cpp
每日一练社区's avatar
每日一练社区 已提交
86
a = (v[idx] * v[idx - 1] + dfs(idx - 2));
每日一练社区's avatar
每日一练社区 已提交
87 88 89
```

### B
F
fix bug  
feilong 已提交
90

每日一练社区's avatar
每日一练社区 已提交
91
```cpp
每日一练社区's avatar
每日一练社区 已提交
92
a = (dfs(idx - 2) + numv[idx - 2] * (v[idx] + v[idx - 1]));
每日一练社区's avatar
每日一练社区 已提交
93 94 95
```

### C
F
fix bug  
feilong 已提交
96

每日一练社区's avatar
每日一练社区 已提交
97
```cpp
每日一练社区's avatar
每日一练社区 已提交
98
a = (v[idx] * v[idx - 1] + dfs(idx - 1) + numv[idx + 2] * (v[idx] + v[idx - 1]));
每日一练社区's avatar
每日一练社区 已提交
99
```