poj1160 Post Office

1465 단어 동적 기획
입력:
4
10 5
1 2 3 6 7 9 11 22 44 50
10개의 작은 마을이 있고 5개의 우체국이 있다는 뜻으로 우체국을 설치하면 모든 마을이 가장 가까운 우체국까지의 거리를 최소화할 수 있다.
작은 마을의 좌표는 1, 2, 3, 6, 7, 9, 11, 22, 44, 50이다
상태 정의:
dp[i][j]는 [0,i] 이 i+1개 마을에 j개 우체국의 가장 작은 손가락을 놓았다는 것을 나타낸다
상태 전환:
dp[i][j]=dp[k][j-1]+L[k+1][i]L[i][j]는 [i, j]가 우체국을 놓을 때의 가장 작은 손가락을 나타낸다. 0<=k코드:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int dp[330][40];//dp[i][j]  0,,,i   j       
int L[330][330];//L[i][j]  [i,j]        
int village[330];
void Run(int i,int j)
{
	int mid=(i+j)/2;
	L[i][j]=0;
	for(int k=i;k<=j;k++)
	{
		L[i][j]+=abs(village[mid]-village[k]);
	}
}
void RunDp(int i,int j)// dp[i][j]   [0,i]
{
	if(j==1)
	{
		if(L[0][i]==-1)
		{
			Run(0,i);
		}
		dp[i][j]=L[0][i];
		return;
	}
	if(i==0)
	{
		if(j>=1)
		{
			dp[i][j]=0;
		}
		return;
	}
	for(int k=0;k<i;k++)
	{
		if(dp[k][j-1]==-1)
		{
			if(k==0&&j==1)
			{
				k=0;
			}
			RunDp(k,j-1);
		}
		if(L[k+1][i]==-1)
		{
			Run(k+1,i);
		}
		if(dp[i][j]==-1||dp[i][j]>dp[k][j-1]+L[k+1][i])
		{
			dp[i][j]=dp[k][j-1]+L[k+1][i];
		}
	}
}
int main()
{
	int V,P;
	while(~scanf("%d%d",&V,&P))
	{
		memset(dp,-1,sizeof(dp));
		memset(L,-1,sizeof(L));
		for(int i=0;i<V;i++)
		{
			scanf("%d",&village[i]);
		}
		RunDp(V-1,P);
		printf("%d
",dp[V-1][P]); } return 0; }

좋은 웹페이지 즐겨찾기