在做这个题时自己对区间dp已经有一定的熟练度了,只不过欠缺了一个思维,这个题为我提供了一个补充
想要了解深入的区间dp处理方法点这里(愣着干嘛,点我啊)
这题又学到了一个思维:简化可能性
也就是说,当你分类时,顺着分可能性很多的情况下,倒着分,直接去考虑最后一步
比如:看我的思考(模拟)过程(错误的)
思路修正:
代码如下:
#include<iostream>
#include<cstring>
#include<algorithm>
#include<iomanip>
using namespace std;
const int N = 300;
const int inf = 0x3f3f3f3f;
int n;
int a[N];
int solve();
int dp[N][N];
int main()
{
cin >> n;
for (int i = 1; i <= n; i++)
cin >> a[i];
cout << solve() << endl;
}
int solve()
{
for (int i = 1; i + 2 <= n; i++)
{
dp[i][i + 2] = a[i] * a[i + 1] * a[i + 2];
}
for (int len = 3; len < n; len++)
for (int i = 1; i + len <= n; i++)
{
int j = i + len;
dp[i][j] = inf;
for (int k = i + 1; k + 1 <= j; k++)
{
dp[i][j] = min(dp[i][j],dp[i][k] + dp[k][j] + a[i] * a[k] * a[j]);
}
}
return dp[1][n];
}