uva437 巴比伦塔 dag模型记忆化搜索

刚开始竟然看错题目了 结果经让做对了!!!!

#include <stdio.h>
#include <string.h>
#define q(i) ((i+2)%3)
#define h(i) ((i+1)%3)
int solve(int,int,int n,int [][3][n][3],int[][3],int[][3]);
int max(int,int);
int is_ok(int,int,int[],int[]);
void solve_mark(int n,int[][3],int[][3][n][3]);
int main(void) 
{
	int n,cs = 0;
	while(scanf("%d",&n)&&n)
	{
		int sz[n][3],i,j;
		for(i = 0;i < n;i++){
			scanf("%d%d%d",sz[i],sz[i]+1,sz[i]+2);
		}
		int mark[n][3][n][3],ans = 0,dg[n][3];
		memset(mark,0,sizeof(mark));memset(dg,-1,sizeof(dg));
		solve_mark(n,sz,mark);
		for(i = 0;i < n;i++){
			for(j = 0;j < 3;j++){
				ans = max(ans,solve(i,j,n,mark,sz,dg));
			}
		}
		cs++;
		printf("Case %d: maximum height = %d\n",cs,ans);
	}
	return 0;
}
int solve(int dq,int dqh,int n,int mark[][3][n][3],int sz[][3],int dg[][3])
{
	if(dg[dq][dqh] != -1) return dg[dq][dqh];
	int i,j;
	dg[dq][dqh] = sz[dq][dqh];
	for(i = 0;i < n;i++){
		for(j = 0;j < 3;j++){
			if(mark[dq][dqh][i][j]){
				dg[dq][dqh] = max(dg[dq][dqh],sz[dq][dqh]+solve(i,j,n,mark,sz,dg));
			}
		}
	}
	return dg[dq][dqh];
}
int max(int a,int b)
{
	return a > b ? a:b;
}
int is_ok(int i,int k,int sz_i[],int sz_k[])
{
	if(sz_i[q(i)] > sz_k[q(k)] && sz_i[h(i)] > sz_k[h(k)]) return 1;
	if(sz_i[q(i)] > sz_k[h(k)] && sz_i[h(i)] > sz_k[q(k)]) return 1;
	return 0;
}
void solve_mark(int n,int sz[][3],int mark[][3][n][3])
{
	int i,j,k,l;
	for(i = 0;i < n;i++){
		for(j = 0;j < 3;j++){
			for(k = 0;k < n;k++){
				for(l = 0;l < 3;l++){
					if(is_ok(j,l,sz[i],sz[k]))	mark[i][j][k][l] = 1;
				}
			}
		}
	}
}
发布了37 篇原创文章 · 获赞 0 · 访问量 362

猜你喜欢

转载自blog.csdn.net/weixin_43191153/article/details/104343878