UVA 10051 Tower of Cubes
2016-04-15 17:22
537 查看
【题意】给了n个立方体,并且给了每个面的颜色!并且给的顺序是按照质量由轻到重,这保证了我们的堆叠肯定是从上往下,且质量递增的。所以我们只需要保证下一个立方体的顶的颜色和上一个的底层相同就可以了。因此这是一个简单DAG上的最长路径问题!实际也可以用最长上升子序列的做法!
【AC代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
const char temp[6][10] = {"front","back","left","right","top","bottom"};
struct node
{
int c[6];
} aa[502];
struct Node
{
int num,color;
} box[502],save[502];
int answer,n;
int dp[502][502];
void dfs(int id,int bottom,int num)
{
for(int i=id+1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
if(id==0||(aa[i].c[j]==bottom&&dp[i][j]<num+1))
{
dp[i][j] = num+1;
if(j%2==1)
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j-1],num+1);
}
else
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j+1],num+1);
}
}
}
}
if(answer<num)
{
answer = num;
for(int i=0; i<num; i++)
{
save[i] = box[i];
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n)
{
for(int i=1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
scanf("%d",&aa[i].c[j]);
}
}
memset(dp,0,sizeof(dp));
answer = 0;
dfs(0,0,0);
printf("Case #%d\n",cas++);
printf("%d\n",answer);
for(int i=0; i<answer; i++)
{
printf("%d %s\n",save[i].num,temp[save[i].color]);
}
printf("\n");
}
return 0;
}
【AC代码】
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
const char temp[6][10] = {"front","back","left","right","top","bottom"};
struct node
{
int c[6];
} aa[502];
struct Node
{
int num,color;
} box[502],save[502];
int answer,n;
int dp[502][502];
void dfs(int id,int bottom,int num)
{
for(int i=id+1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
if(id==0||(aa[i].c[j]==bottom&&dp[i][j]<num+1))
{
dp[i][j] = num+1;
if(j%2==1)
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j-1],num+1);
}
else
{
box[num].num = i;
box[num].color = j;
dfs(i,aa[i].c[j+1],num+1);
}
}
}
}
if(answer<num)
{
answer = num;
for(int i=0; i<num; i++)
{
save[i] = box[i];
}
}
}
int main()
{
int cas=1;
while(scanf("%d",&n)&&n)
{
for(int i=1; i<=n; i++)
{
for(int j=0; j<6; j++)
{
scanf("%d",&aa[i].c[j]);
}
}
memset(dp,0,sizeof(dp));
answer = 0;
dfs(0,0,0);
printf("Case #%d\n",cas++);
printf("%d\n",answer);
for(int i=0; i<answer; i++)
{
printf("%d %s\n",save[i].num,temp[save[i].color]);
}
printf("\n");
}
return 0;
}
相关文章推荐
- Android Studio 比较好的资源收集
- hdu3294(manacher)
- CentOS中mysql的安装与配置
- 关于Xcode的Other Linker Flags
- 蓝桥杯 第七届省赛试题 煤球数目
- DataTable转Excel并对0开头的数值保留0显示
- 多线程应用-类(thread)
- 160415、sql语句sort排序,sort为空的在后面
- QueryRunner使用
- c3p0操作MySQL数据库
- saiku执行速度慢
- XMLHttpRequest实现终止请求和超时
- javascript 二分查找排序
- 手游性能优化之深入理解Texture Compression
- json解析,jquery解析遍历json
- PostgreSQL代码分析,查询优化部分,canonicalize_qual
- saiku执行速度慢
- ENVI软件操作【数据显示操作——Overlay菜单操作】
- Java中参数的引用传递和值传递
- 返回一个一维整数数组中最大子数组的和