poj2904--the mailbox manufrature problem.cpp

来自「DP好题」· C++ 代码 · 共 48 行

CPP
48 行
字号
#include<iostream>
using namespace std;
const int K=11;
const int N=110;
const int INF=1000000;

int max(int a,int b)
{
	return a>b?a:b;
}

int box,crack,cost[K][N][N];
int main()
{
	int t,i,j,wide,k,mid;
	int result,tmp1,tmp2;
	scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d",&box,&crack);
		memset(cost,0,sizeof(cost));
		for(i=1;i<=crack;i++)
			for(j=i;j<=crack;j++)
				cost[1][i][j]=(i+j)*(j-i+1)/2;
			for(i=2;i<=box;i++)
				for(wide=1;wide<=crack;wide++)
					for(k=1;k+wide-1<=crack;k++)
					{
					/*if(wide==1)
					{
					cost[i][k][k]=k;
					continue;
					}*/
						cost[i][k][k+wide-1]=INF;				
						for(mid=k;mid<=k+wide-1;mid++)
						{
							tmp1=cost[i-1][k][mid-1];
							tmp2=cost[i][mid+1][k+wide-1];//这里的mid+1有可能会造成数组的越界
							result=max(tmp1,tmp2)+mid;
							if(result<cost[i][k][k+wide-1])
								cost[i][k][k+wide-1]=result;
						}
					}
					printf("%d\n",cost[box][1][crack]);
	}
	return 0;
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?