(区间dp)ZJNU-H - Running Routes

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;
}

发布了119 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Z7784562/article/details/104221634
今日推荐