1. 程式人生 > >[luogu 2066] 機器分配{區間dp}

[luogu 2066] 機器分配{區間dp}

題目

https://www.luogu.org/problemnew/show/P2066


解題思路

f [ i ] [ j ]

f[i][j] 表示前 i i 個公司分配了 m m 個裝置的最大值,用 s
u m [ i ] [ j ] sum[i][j]
記錄路徑——即每次最大的 k
k
。動態轉移方程為 f [ i ] [ j ] = m a x { f [ j k ] + w e i g h t [ i ] [ k ] } ( k < = j ) f[i][j]=max\{ f[j-k]+weight[i][k]\}(k<=j) ,輸出最小字典序的時候,可以倒著減去當前的裝置數量即可,


程式碼

#include<cstdio>
#define rfor(i,x,y) for (register int i=x;i<=y;++i)
#define rfo(i,x,y) for (register int i=x;i>=y;--i)
int f[101],t[101][101],n,m,sum[101][101]; 
int main()
{
	scanf("%d%d",&n,&m); 
	rfor(i,1,n) rfor(j,1,m) scanf("%d",&t[i][j]); 
	rfo(i,n,1) rfo(j,m,1) rfor(k,1,j)
	 if (f[j-k]+t[i][k]>f[j]) {f[j]=f[j-k]+t[i][k]; sum[i][j]=k;}
	printf("%d\n",f[m]); 
	for (register int i=1,j=m;i<=n;putchar(10),i++)
	 printf("%d %d",i,sum[i][j]),j-=sum[i][j]; 
}