D. Three Pieces(dp,array用法,棋盘模型)
https://codeforces.com/contest/1065/problem/D
题意
给你一个方阵,里面的数字从1~nn,你需要从标号为1的格子依次走到标号为nn,在每一个格子你有两个决策:
1.换工具(车,马,象)
2.不换工具,继续走
换工具本身算作一步,问最少需要多少步才能完成目标,要是步数相同,需要换工具步数最小
思路
思路十分明确,每个格子有三个状态,处理出每个格子每个状态之间的最小步,然后从编号为1的格子进行dp,答案就是
min(dp[id[n]][0~2])
处理
这道题难在处理
- 怎么保证状态编号唯一
首先将二维坐标一维化,因为每个位置有三种状态等于加了一维上去,所以要将一维化的坐标*3,再加上0~2,每一个格子每一种状态就形成唯一的编号
- 怎么处理车,马,象
车:ip||jq
马: abs(i-p)+abs(j-q)3
象:i+jp+q||i-j==p-q
需要注意的是,一定要用if else if 并且注意判断顺序(先判车后判马),因为对于车的判定有的马会在里面,所以必须得先把车给判掉
- 关于答案的计算
学了一下array,可以直接比较(按下标逐个比),可以重载运算符
还有memset可以初始化结构体,1大概是1e7
#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
#define M 505
using namespace std;
array<int,2> f[M][M],dp[M][5],ans;
int n,i,j,k,a[M],p,q,x,y;
int id(int x,int y){return (x*n+y)*3;}
array<int,2> operator+(const array<int,2> a,const array<int,2> b){
return {a[0]+b[0],a[1]+b[1]};
}
int main(){
cin>>n;
for(i=0;i<n*n;i++){cin>>x;a[x]=i;}
memset(f,1,sizeof(f));memset(dp,1,sizeof(dp));
for(i=0;i<n;i++){
for(j=0;j<n;j++){
for(p=0;p<3;p++)for(q=0;q<3;q++){
x=id(i,j);
f[x+p][x+q]={1,1};
}
for(p=0;p<n;p++){
for(q=0;q<n;q++){
x=id(i,j);y=id(p,q);
if(p==i||q==j)f[x][y]={1,0};
else if(abs(i-p)+abs(j-q)==3)f[x+1][y+1]={1,0};
else if(p+q==i+j||p-q==i-j)f[x+2][y+2]={1,0};
}
}
}
}
for(k=0;k<3*n*n;k++)for(i=0;i<3*n*n;i++)for(j=0;j<3*n*n;j++)f[i][j]=min(f[i][j],f[i][k]+f[k][j]);
dp[1][0]=dp[1][1]=dp[1][2]={0,0};
for(i=2;i<=n*n;i++){
q=a[i]*3;p=a[i-1]*3;
for(j=0;j<3;j++)
for(k=0;k<3;k++)
dp[i][j]=min(dp[i][j],dp[i-1][k]+f[p+k][q+j]);
}
ans=min(dp[n*n][0],min(dp[n*n][1],dp[n*n][2]));
cout<<ans[0]<<" "<<ans[1];
}
D. Three Pieces(dp,array用法,棋盘模型)的更多相关文章
- 前端-----margin用法(盒子模型里补充)
margin塌陷问题 当时说到了盒模型,盒模型包含着margin,为什么要在这里说margin呢?因为元素和元素在垂直方向上margin里面有坑. 我们来看一个例子: html结构: <div ...
- 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )
Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...
- POJ 1185 炮兵阵地 (状压dp)(棋盘dp)
这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...
- 暑假集训Day2 状压dp 特殊方格棋盘
首先声明 : 这是个很easy的题 可这和我会做有什么关系 题目大意: 在n*n的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数. 注意:同一行或同一列只能有一个车,否则会相互攻 ...
- JavaScript之中Array用法的一些技巧总结
1.创建一个全部为0,长度为100的数组(ES6) Array(10).fill(0) 2.创建一个长度为100的数组,其中保存0 ~ 99 let array = Array(100).fill(0 ...
- ios初识UITableView及简单用法二(模型数据)
// // ViewController.m // ZQRTableViewTest // // Created by zzqqrr on 17/8/24. // Copyright (c) 2017 ...
- javascript Object与Array用法
引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起.引用类型的值是引用类型的一个实例. 一.Object ECMAScript中的对象其实就是一组数据和功能的结合. Object类型其实是所 ...
- poj 3254 Corn Fields (状压dp)(棋盘dp)
状压dp入门题 因为当前行的状态只和上一行有关 所以可以一行一行来做 因为m <= 12所以可以用二进制来表示放了或者没有放 0表示没放,1表示放 f[i][state]表示第i行状态为stat ...
- 数组Array用法
一 创建数组 // 指定长度(稀疏数组) const arr1 = Array(2); console.log(arr1); const arr2 = new Array(4); console.lo ...
随机推荐
- PTA 7-6 列出连通集(深搜+广搜)
给定一个有N个顶点和E条边的无向图,请用DFS和BFS分别列出其所有的连通集.假设顶点从0到N−1编号.进行搜索时,假设我们总是从编号最小的顶点出发,按编号递增的顺序访问邻接点. 输入格式: 输入第1 ...
- 构造,析构 cpp
一 构造析构常识: 1,c++ 处理类,若没有声明,则编译器默认声明构造,拷贝赋值,拷贝构造,析构函数.所有这些函数都是public且inline的. 2,编译器产出的析构函数是非虚函数.(non-v ...
- HUABASE :基于列存储的关系型数据库系统
摘要 HUABASE 是基于列存储的关系型数据库系统.列存储技术的特点是数据查询效率高,读磁盘少,存储空间少,是构建数据仓库的理想架构. HUABASE 实现了多种数据压缩机制.查询优化和稀疏索引 ...
- EasyUI Dialog 对话框 关闭事件
在 $('#×××').dialog('close'); 执行后触发 $(function(){ $("#titledialos").dialog({ onClose: fun ...
- Ansible Playbook 详解
一.playbook 的简单使用 1.创建文件实例 (1)编辑配置文件 [root@tiejiangSRC1 ~]# cd /etc/ansible/ [root@tiejiangSRC1 ansib ...
- <context:annotation-config/>,<mvc:annotation-driven/>和<context:component-scan>之间的关系
首先看一下三个注解各自定义: ① <context:annotation-config/> 1.如果你想使用@Autowired注解,那么就必须事先在 spring 容器中声明 Autow ...
- go语言中的坑
package main; import ( "fmt" "time" "sync" ) //修改slice的坑 func add(s [] ...
- golang基础学习
一.输出hello,world程序 package main; import "fmt"; func main() { fmt.Printf("hello,world&q ...
- Aspose.words一 DOM结构
2.文档对象模型概述 2.1 DOM介绍 Aspose.Words的文档对象模型(以下简称DOM)是一个Word文档在内存中的映射,Aspose.Words的DOM可以编程读取.操作和修改Word文档 ...
- 洛谷2860 [USACO06JAN]冗余路径Redundant Paths
原题链接 题意实际上就是让你添加尽量少的边,使得每个点都在至少一个环上. 显然对于在一个边双连通分量里的点已经满足要求,所以可以用\(tarjan\)找边双并缩点. 对于缩点后的树,先讲下我自己的弱鸡 ...