poj 1160 동태 기획(1차원 도시 우체국 건설)

1307 단어
제목: 수축에 n개의 도시(좌표로 제시)가 있고, m(m사고방식: dp[i][j]: 전 i개 마을에서 j개 우체국을 설립하는 데 가장 적은 비용.dis[i][j]: i번째 마을에서 j번째 마을까지 우체국 1개를 세우는 데 드는 최소 비용.간단한 비교를 통해 알 수 있듯이dis[i][j]의 구법은 우체국을 i와 j의 중점 마을에 세우기 위한 것이다.그래서 전이 방정식: dp[i][j]=min(dp[i][j], dp[k][j-1]+dis[k+1][i])
DP의 경계 상태는 dp[i][1] = dis[1][i]입니다.
#include <stdio.h>
#include <string.h>
#define N 303
int n,m;
int dp[N][N],dis[N][N],s[N];
int min(int a,int b){
	if(a<b)
		return a;
	return b;
}
int main(){
	freopen("a.txt","r",stdin);
	while(scanf("%d %d",&n,&m)!=EOF){
		int i,j,k;
		memset(dis,0,sizeof(dis));
		for(i = 0;i<=n;i++)
			for(j = 0;j<=n;j++)
				dp[i][j] = 0x3fffffff;
		for(i = 1;i<=n;i++)
			scanf("%d",&s[i]);
		for(k = 1;k<n;k++)//  dis  
			for(i = 1;i+k<=n;i++){
				dis[i][i+k] = s[i+k]-s[i];
				for(j = 1;i+j<i+k-j;j++)
					dis[i][i+k] += s[i+k-j] - s[i+j];
			}
		for(i = 1;i<=n;i++)
			dp[i][1] = dis[1][i];
		for(i = 1;i<=n;i++)
			for(j = 2;j<=i&&j<=m;j++)
				for(k = j-1;k<i;k++)
					dp[i][j]=min(dp[i][j],dp[k][j-1]+dis[k+1][i]);
		printf("%d
",dp[n][m]); } return 0; }

좋은 웹페이지 즐겨찾기