思路
我们可以这样设计状态:
d
p
i
,
j
(
i
<
=
j
)
dp_{i, j}(i <= j)
dpi,j(i<=j) 表示区间
[
i
,
j
]
[i, j]
[i,j] 内合法连接方案中最多的连接数,
v
i
,
j
v_{i, j}
vi,j则表示
从
i
i
i到
j
j
j是否存在路径,存在为
1
1
1 ,不存在则为
0
0
0 。
code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll N = 505;
int dp[N][N], a[N][N], n;
int main()
{
cin >> n;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> a[i][j];
for(int len = 1; len <= n; len++)//阶段
for(int l = 1; l <= n - len; l++)//起点
{
int r = l + len;//终点
for(int k = l; k <= r; k++)//决策
dp[l][r] = max(dp[l][r], dp[l+1][k-1] + a[l][k] + dp[k+1][r]);
}
cout << dp[1][n] << endl;
return 0;
}