1. 程式人生 > >[codevs1048]石子歸並&&[codevs2102][洛谷P1880]石子歸並加強版

[codevs1048]石子歸並&&[codevs2102][洛谷P1880]石子歸並加強版

++i 歸並 每次 方程 合並 經典 ron size mem

codevs1048:

題目大意:有n堆石子排成一列,每次可合並相鄰兩堆,代價為兩堆的重量之和,求把他們合並成一堆的最小代價。

解題思路:經典區間dp。設$f[i][j]$表示合並i~j的石子需要的最小代價。則有$f[i][j]=min(f[i][k]+f[k+1][j]+\sum\limits _{l=i}^{j}a[l])$,時間復雜度$O(n^3)$。

C++ Code:

#include<cstdio>
#include<cstring>
using namespace std;
int n,a[102],f[102][102],s[102];
int main(){
	scanf("%d",&n);
	memset(f,0x3f,sizeof f);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]),s[i]=s[i-1]+a[i],f[i][i]=0;
	for(int i=n;i;--i)
	for(int j=i+1;j<=n;++j)
	for(int k=i;k<j;++k)
	if(f[i][j]>f[i][k]+f[k+1][j]+s[j]-s[i-1])f[i][j]=f[i][k]+f[k+1][j]+s[j]-s[i-1];
	printf("%d\n",f[1][n]);
	return 0;
}

註意代碼第9行,為什麽i要倒著循環?舉個栗子,如果要求f[1][10],就有f[1][10]=min(f[1][10],f[1][5]+f[6][10]+sum[1][10]),但是i才循環到1,就需要f[6][10]的結果,於是導致答案錯誤。而倒著循環,就可保證i+1~n的所有數據都已求完,就不會導致答案錯誤了。

codevs2102&&洛谷P1880:

題目大意:有n堆石子擺成環狀,每次可合並相鄰兩堆,代價為兩堆的重量之和,求把他們合並成一堆的最小代價和最大代價。

解題思路:本題除了是個環以外,和上題沒什麽區別。我們可以用化環為鏈的方法,具體的實現就是將這個環的單圈復制一遍,然後做n次上述dp即可。求最大價值就是把狀態轉移方程裏的$min$改成$max$即可。時間復雜度$O(n^4)$,但代碼運行量應該是不到這個極限的。

C++ Code:

#include<cstdio>
#include<cstring>
using namespace std;
int n,a[202],fmax[202][202],fmin[202][202],s[202],Max=0,Min=200000000;
void dp(int h){
	for(int i=n;i;--i){
		fmax[i+h][i+h]=fmin[i+h][i+h]=0;
		for(int j=i+1;j<=n;++j){
			fmax[i+h][j+h]=0;
			fmin[i+h][j+h]=200000000;
			for(int k=i;k<j;++k){
				if(fmax[i+h][j+h]<fmax[i+h][k+h]+fmax[k+h+1][j+h]+s[j+h]-s[i+h-1])
				fmax[i+h][j+h]=fmax[i+h][k+h]+fmax[k+h+1][j+h]+s[j+h]-s[i+h-1];
				if(fmin[i+h][j+h]>fmin[i+h][k+h]+fmin[k+h+1][j+h]+s[j+h]-s[i+h-1])
				fmin[i+h][j+h]=fmin[i+h][k+h]+fmin[k+h+1][j+h]+s[j+h]-s[i+h-1];
			}
		}
	}
	if(Max<fmax[1+h][n+h])Max=fmax[1+h][n+h];
	if(Min>fmin[1+h][n+h])Min=fmin[1+h][n+h];
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;++i)scanf("%d",&a[i]),s[i]=s[i-1]+a[i];
	for(int i=n+1;i<2*n;++i)
	a[i]=a[i-n],s[i]=s[i-1]+a[i];
	for(int i=1;i<=n;++i)
	dp(i-1);
	printf("%d\n%d\n",Min,Max);
	return 0;
}

[codevs1048]石子歸並&&[codevs2102][洛谷P1880]石子歸並加強版