这篇题解思路显然错误,我自己打了个代码:
#include <bits/stdc++.h>
using namespace std;
int dp[55][55];
int m, sum, a[55], b[55];
int main()
{
cin >> m;
for (int i = 1; i <= m; i++)
cin >> a[i];
for (int i = 1; i <= m; i++)
{
cin >> b[i];
dp[i][i] = b[i] * b[i];
}
for (int len = 2; len <= m; len++)
{
for (int i = 1; i + len - 1 <= m; i++)
{
int j = i + len - 1;
for (int k = i; k < j; k++)
dp[i][j] = max(dp[i][j], dp[i][k] + dp[k + 1][j]);
for (int k = 1; k <= m; k++)
{
int ans = 0, sum = 0;
for (int l = i; l <= j; l++)
{
if (a[l] == k)
sum += b[l];
else
ans += b[l] * b[l];
}
dp[i][j] = max(dp[i][j], ans + sum * sum);
}
}
}
cout << dp[1][m];
return 0;
}
交上去只有30pts