如何解答这个问题:
给定 n 个气球,索引从 0 到 n-1。每个气球上都画有一个由数组 nums 表示的数字。你被要求爆破所有的气球。如果你爆破气球,你将获得 nums[left] * nums[right] 个硬币。这里 left 和 right 是 i 的相邻索引。爆破后,左右就会变得相邻。如果你爆破角气球,那么你将得到与这些气球相邻的点。如果你爆破最后一个气球,那么你将得到上面写的点数。明智地爆破气球,找到可以收集的最多硬币。
测试用例示例:
{1,2,3,4}
20
{5,7,8}
56
我已经尝试使用递归来解决这个问题,这似乎给出了正确的答案:
public static int maxCoints(List<Integer> list) {
int max = 0;
if (list.size() == 1) {
return list.get(0);
}
if(list.size() == 2) {
return Math.max(list.get(0),list.get(1))*2;
}
for (int i = 0; i < list.size(); i++) {
int left = i == 0 ? 1 : list.get(i-1);
int right = i == list.size()-1 ? 1 : list.get(i+1);
int n = left * right;
List<Integer> tmp = new ArrayList<>(list);
tmp.remove(i);
max = Math.max(max, n + maxCoints(tmp));
}
return max;
}
但我已经尝试过这种分而治之的解决方案,但它似乎对第一个测试用例给出了错误的答案,这给出了答案 17 而不是 20
int find(vector<int>& v, int L, int R) {
int ans = 0;
// if(L==R) return v[L];
for (int i = L; i <= R; i++) {
int l = find(v, L, i-1);
int r = find(v, i+1, R);
int val = v[L-1]*v[R+1] + l + r;
ans = max(ans, val);
}
return ans;
}
int32_t main() {
fast_io;
ll tt; cin >> tt;
while(tt--) {
ll n; cin >> n;
vector<int> v(n+2,1);
for(int i=1;i<=n;i++) {
cin >> v[i];
}
cout << find(v,1,n) << "\n";
}
return 0;
}
请帮我找出错误。
神不在的星期二
相关分类