原题链接
题意
给你n个坚果。每次不能删第一个和最后一个。删除一个坚果耗费
(a[i]+a[i-1]+a[i+1])^2。求最终删剩下两个坚果最小花费。
题解
设
f
[
i
]
[
j
]
f[i][j]
f[i][j]表示保留 i 和 j 并删除i-j之间坚果的最小花费。
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
]
[
j
]
,
f
[
i
]
[
k
]
+
f
[
k
]
[
j
]
+
p
(
a
[
i
]
+
a
[
k
]
+
a
[
j
]
)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]+p(a[i]+a[k]+a[j])
f[i][j]=min(f[i][j],f[i][k]+f[k][j]+p(a[i]+a[k]+a[j])
len从3开始枚举即可(中间才有坚果可删)。两个及以下没有意义。
#include<bits/stdc++.h>
using namespace std;
const int N=105;
int f[N][N],a[N];
int p(int x)
{
return x*x;
}
int main()
{
int n;
while(cin>>n)
{
for(int i=1;i<=n;i++)cin>>a[i];
for(int len=3;len<=n;len++)
for(int i=1;i+len-1<=n;i++)
{
int j=i+len-1;
f[i][j]=0x3f3f3f3f;
for(int k=i+1;k<j;k++)
f[i][j]=min(f[i][j],f[i][k]+f[k][j]+p(a[i]+a[j]+a[k]));
}
cout<<f[1][n]<<endl;
}
return 0;
}