您的位置:首页 > 其它

hdu 3576 Elevators in Jiayuan Students' Apartment(DP)

2012-09-14 09:40 363 查看
tup[ f ][ i ] [ j ] [ k ]表示 第f层第一个电梯i个人,第二个电梯j个人,第三个电梯k个人的情况下要停几次。

#include<iostream>
#include<string.h>
#define INF 0x7fffffff
using namespace std;
int hash[20];
int tup[20][20][20][20];
int v , n;

int dp()
{
tup[1][0][0][0]=0;
for(int f=2;f<=16;f++)
{
for(int i=0;i<=v;i++)
{
for(int j=0;j<=v;j++)
{
for(int k=0;k<=v;k++)
{
if(tup[f-1][i][j][k]==-1) continue;
if(i+j+k>n) continue;
int temp=0;
for(int x=0;x<=hash[f];x++)
{
for(int y=0;y<=hash[f];y++)
{
if(x+y>hash[f]) continue;
int z = hash[f]-x-y;
if(i+x>v || j+y>v || z+k>v) continue;
temp=tup[f-1][i][j][k];
if(x>0) temp++;
if(y>0) temp++;
if(z>0) temp++;
if(temp<tup[f][i+x][j+y][k+z] || tup[f][i+x][j+y][k+z]==-1)
tup[f][i+x][j+y][k+z]=temp;
}
}
}
}
}
}
int ans=INF;
for(int i=0;i<=v;i++)
{
for(int j=0;j<=v;j++)
{
if(i+j>n) continue;
int k=n-i-j;
if(tup[16][i][j][k]==-1) continue;
ans=min(ans, tup[16][i][j][k]);
}
}
return ans;
}

int main()
{
int t , u=0 , x;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&v, &n);
memset(hash,0,sizeof(hash));
memset(tup,-1,sizeof(tup));
for(int i=0;i<n;i++)
{
scanf("%d",&x);
hash[x]++;
}
printf("Case %d: %d\n", ++u, dp());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: