标签:margin 等于 mes get ace open 内存 大于 不用
http://www.cogs.pro/cogs/problem/problem.php?pid=261
★★ 输入文件:buildinggame.in
输出文件:buildinggame.out
简单对比
时间限制:1 s 内存限制:128 MB
SERCOI 最近设计了一种积木游戏。每个游戏者有N块编号依次为1 ,2,…,N的长方体积木。对于每块积木,它的三条不同的边分别称为”a边”、“b边”和”c边”,如下图所示:
游戏规则如下:
最后,根据每人所摞成的M根柱子的高度之和来决出胜负。
请你编一程序,寻找一种摞积木的方案,使得你所摞成的M根柱子的高度之和最大。
输入文件的第一行有两个正整数N和M(1<=M<=N<=100),分别表示积木总数和要求 摞成的柱子数。这两个数之间用一个空格符隔开。接下来N行依次是编号从1到N的N个积木的尺寸,每行有三个1至1000之间的整数,分别表示该积木a 边,b边和c边的长度。同一行相邻两个数之间用一个空格符隔开。
输出文件只有一行,为一个整数,表示M根柱子的高度之和。
输入文件
4 2
10 5 5
8 7 7
2 2 2
6 6 6
输出文件
24
/* f[k][i][j][l] 表示 前i个积木分为k组,第k组最后一个是j,j的摆放方式为l的最大高度 为了方便比较大小关系,可以先对输入每块积木的a,b,c排序,这样在DP中就不用判断同一块积木的长宽高 排序方式,每块积木最小的参数为a,中间的是b,最大的为c 状态表示方法: 0 表示 ab面为底;1 表示 ac面为底; 2表示bc面为底 */ #include<cstdio> #include<algorithm> using namespace std; int n,m,a[101],b[101],c[101],f[101][101][101][3]; int main() { freopen("buildinggame.in","r",stdin); freopen("buildinggame.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d%d%d",&a[i],&b[i],&c[i]); if(a[i]>b[i]) swap(a[i],b[i]); if(b[i]>c[i]) swap(b[i],c[i]); if(a[i]>b[i]) swap(a[i],b[i]); } for(int k=1;k<=m;k++) for(int i=1;i<=n;i++) for(int j=0;j<i;j++) for(int l=0;l<=2;l++) { int aa,bb,cc; if(l==0) aa=a[i],bb=b[i],cc=c[i]; else if(l==1) aa=a[i],bb=c[i],cc=b[i]; else aa=b[i],bb=c[i],cc=a[i]; if(aa<=a[j]&&bb<=b[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][0]+cc); if(aa<=a[j]&&bb<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][1]+cc); if(aa<=b[j]&&bb<=c[j]) f[k][i][i][l]=max(f[k][i][i][l],f[k][i-1][j][2]+cc); f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][0]+cc); f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][1]+cc); f[k][i][i][l]=max(f[k][i][i][l],f[k-1][i-1][j][2]+cc); f[k][i][j][l]=max(f[k][i][j][l],f[k][i-1][j][l]); } int ans=0; for(int i=1;i<=n;i++) for(int j=0;j<=2;j++) ans=max(ans,f[m][n][i][j]); printf("%d",ans); }
标签:margin 等于 mes get ace open 内存 大于 不用
原文地址:http://www.cnblogs.com/L-Memory/p/7658359.html