记录编号 185332 评测结果 AAAAAAAAAA
题目名称 [NOI 1997]积木游戏 最终得分 100
用户昵称 Gravatarmikumikumi 是否通过 通过
代码语言 C++ 运行时间 0.225 s
提交时间 2015-09-06 11:32:39 内存使用 0.36 MiB
显示代码纯文本
#include<cstdio>
#include<iostream>
#include<cstring>
#include<iomanip>
#include<cmath>
#include<algorithm>
using namespace std;
int N,M;
int f[110][110][3]={0};//0代表a-b面在上面,1代表b-c面在上面,2代表a-c面在上面
class miku
{
public:
	int a,b,c;
}B[110];
bool pan2(int a,int b,int c,int d)
{
	if(a>b) swap(a,b);
	if(c>d) swap(c,d);
	return c<=a&&d<=b;
}
bool pan(int t,int p,int j,int k)
{
	int xa,xb,ya,yb;
	if(p==0) xa=B[t].a,xb=B[t].b;
	if(p==1) xa=B[t].b,xb=B[t].c;
	if(p==2) xa=B[t].a,xb=B[t].c;
	if(k==0) ya=B[j].a,yb=B[j].b;
	if(k==1) ya=B[j].b,yb=B[j].c;
	if(k==2) ya=B[j].a,yb=B[j].c;
	return pan2(xa,xb,ya,yb);
}
int height(int i,int type)
{
	if(type==0) return B[i].c;
	if(type==1) return B[i].a;
	else return B[i].b;
}
void DP()
{
	for(int i=1;i<=M;i++)//第几堆积木
		for(int j=1;j<=N;j++)//第几块
			for(int k=0;k<3;k++)
				for(int t=0;t<j;t++)
					for(int p=0;p<3;p++)
					{
						f[i][j][k]=max(f[i][j][k],f[i-1][t][p]+height(j,k));
						if(pan(t,p,j,k)) f[i][j][k]=max(f[i][j][k],f[i][t][p]+height(j,k));
						//cout<<t<<" "<<p<<" "<<j<<" "<<k<<" "<<pan(t,p,j,k)<<endl;
					}
	int ans=0;
	for(int j=1;j<=N;j++)
		for(int t=0;t<3;t++)
			ans=max(ans,f[M][j][t]);
	printf("%d",ans);
}
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",&B[i].a,&B[i].b,&B[i].c);
	DP();
	return 0;
}