求助大佬!
查看原帖
求助大佬!
121769
2020xl楼主2020/8/9 10:07
#include<bits/stdc++.h>
using namespace std;
int m,n,juli[501][501],canju,answertot,onetot;
int search(int town,int school)
{	
	int onettot=0;
	if(town==0)	return 0; //边界 
	if(town<=school)	return 0;//边界
	if(school==1)//边界
	{
		for(int i=1;i<town/2;i++)//当学校是中间时最短 
		{
			onetot+=juli[i][town/2];
		}
		for(int i=town/2;i<=town;i++)
		{
			onetot+=juli[town/2][i];
		}
		return onetot;
	}
	if(school==0)//边界 
	{
		return juli[1][town];
	} 
	return min(search(town-1,school)+juli[town-1][town],search(town-1,school-1));//新增一个点
	//DP考虑在town的位置建或不建学校 建: search(town-1,school-1),不建 search(town-1,school)+juli[town-1][town]
}
void init()
{
	int i;
	cin>>m>>n;
	for(int i=1;i<=m-1;i++)
	{
	    cin>>canju;
		if(i==m-1)//成一个环 
		{
			juli[i][1]=juli[1][i]=canju;
		}
		else
		    juli[i][i+1]=juli[i+1][i]=canju;
		for(int j=1;j<=i;j++)
		{
			if(i==j)
			{
				juli[j][i]=juli[i][j]=0;//自己到自己为0 
			}
			else
			juli[j][i]=juli[i][j]=juli[j][i-1]+canju;//所有的点之间的距离 
		}
	}
}
int main()
{
	memset(juli,0x3f3f,sizeof(juli));  //town之间距离无限大 
	init();//输入 
	answertot=search(m,n);//solve部分; 
	cout<<answertot;
	return 0;
}
2020/8/9 10:07
加载中...