标签:
★★ 输入文件: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
水DP。
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 using namespace std; 5 const int maxn=110; 6 int a[maxn][3]; 7 int dp[maxn][maxn][3],n,m; 8 int main(){ 9 freopen("buildinggame.in","r",stdin); 10 freopen("buildinggame.out","w",stdout); 11 scanf("%d%d",&n,&m); 12 for(int i=1;i<=n;i++) 13 scanf("%d%d%d",&a[i][0],&a[i][1],&a[i][2]); 14 memset(dp,0x80,sizeof(dp));dp[0][0][0]=dp[0][0][1]=dp[0][0][2]=0; 15 for(int i=1;i<=m;i++) 16 for(int j=1;j<=n;j++) 17 for(int h=0;h<j;h++) 18 for(int k=0;k<=2;k++) 19 for(int l=0;l<=2;l++){ 20 int x1,y1,x2,y2; 21 x1=a[h][k]; 22 y1=a[h][(k+1)%3]; 23 x2=a[j][l]; 24 y2=a[j][(l+1)%3]; 25 if(x1>y1)swap(x1,y1); 26 if(x2>y2)swap(x2,y2); 27 if(x1>=x2&&y1>=y2) 28 dp[i][j][l]=max(dp[i][j][l],dp[i][h][k]+a[j][(l+2)%3]); 29 dp[i][j][l]=max(dp[i][j][l],dp[i-1][h][k]+a[j][(l+2)%3]); 30 } 31 int ans=0; 32 for(int i=1;i<=n;i++) 33 ans=max(ans,max(max(dp[m][i][0],dp[m][i][1]),dp[m][i][2])); 34 printf("%d\n",ans); 35 return 0; 36 }
动态规划(水题):COGS 261. [NOI1997] 积木游戏
标签:
原文地址:http://www.cnblogs.com/TenderRun/p/5379812.html