【发布时间】:2020-01-19 11:46:04
【问题描述】:
如何解决这个问题:
给定 n 个气球,索引从 0 到 n-1。每个气球都涂有 其上的数字由数组 nums 表示。你被要求爆裂所有 气球。如果你爆破气球 i 你会得到 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;
}
请帮我找出错误。
【问题讨论】:
-
版主说明:请勿破坏帖子;根据您发布它的那一刻,它已被许可给该网站的条款和条件。我们不会在获得答案后删除问题,因为发布的解决方案可能对未来的访问者有所帮助。
-
(看来我昨晚不小心清除了您要求删除的标志,通常会被拒绝。如果造成混乱,我深表歉意)。