ZJNU-H - Running Routes
题意&思路:
n个点构成一个正n边形图,点与点之间可能有线段,最多能选出几条不相交的线段。
第一次推出了方程却WA的dp。
dp[i][j]表示i点与j点之间最多能选多少,dp[i][j]=max{dp[i+1][k-1]+dp[k+1][j]+a[i][k]}(i≤k≤j)。
但是还是没写对,因为之前学长教的区间dp的方法忘掉了。
第一层循环枚举区间长度,第二层循环枚举区间左右端点,第三层循环枚举间断点。
代码:
#include<bits/stdc++.h>
#define pii pair<int,int>
#define ll long long
#define cl(x,y) memset(x,y,sizeof(x))
#define ct cerr<<"Time elapsed:"<<1.0*clock()/CLOCKS_PER_SEC<<"s.\n";
const int N=1e6+10;
const int mod=1e7+9;
const int maxn=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
const int inf=99999999;
using namespace std;
int a[600][600]={0},dp[600][600]={0};
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int n,i,j,k,len;
cin>>n;
for(i=0;i<n;i++)
for(j=0;j<n;j++)
cin>>a[i][j];
for(len=1;len<n;len++)
for(i=0;i<n-len;i++)
{
j=i+len;
for(k=i;k<=j;k++)
dp[i][j]=max(dp[i][j],dp[i+1][k-1]+dp[k+1][j]+a[i][k]);
}
cout<<dp[0][n-1]<<endl;
return 0;
}