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 ...
随机推荐
- swift语言版本选择 - 解决XCode报错:The “Swift Language Version” (SWIFT_VERSION) build setting must be set to a supported valu
转发链接:https://blog.csdn.net/nathan1987_/article/details/79757368 The “Swift Language Version” (SWIFT_ ...
- Java通过遍历sessionId获取服务器所有会话session
Servlet2.1之后不支持SessionContext里面getSession(String id)方法,也不存在遍历所有会话Session的方法.但是,我们可以通过HttpSessionList ...
- Python数据分析--Pandas知识点(二)
本文主要是总结学习pandas过程中用到的函数和方法, 在此记录, 防止遗忘. Python数据分析--Pandas知识点(一) 下面将是在知识点一的基础上继续总结. 13. 简单计算 新建一个数据表 ...
- 44-java断点调式dubug
转自:https://www.cnblogs.com/mq0036/p/3780538.html Eclipse 的单步调试 1.设置断点在程序里面放置一个断点,也就是双击需要放置断点的程序左边的栏目 ...
- widdow.locationg.可跟的参数,获取url不同的地址
- 当前的开源SLAM方案
开源方案 传感器形式 地址链接 MonoSLAM 单目 https://github.com/hanmekim/SceneLib2 PTAM 单目 http://www.robots.ox.ac. ...
- C#读取Excel表中的数据时混合字段部分数据没有
解决同一列中“字符串”和“数字”两种格式同时存在,读取时,不能正确显示“字符串”格式的问题:set xlsconn=CreateObject("ADODB.Connection") ...
- Oracle to_char函数的使用方法
Oracle to_char函数的功能是将数值型或者日期型转化为字符型,下面就为您详细介绍Oracle to_char函数的使用,希望对您能有所帮助. Postgres 格式化函数提供一套有效的工具用 ...
- 爬取掌阅app免费电子书数据
主要介绍如何抓取app数据及抓包工具的使用,能看到这相信你已经有爬虫基础了 编不下去了,主要是我懒,直接开干吧! 一.使用环境和工具 windows + python3 + Jsonpath + Ch ...
- 关于redis和memcached的一些想法
看了redis和memcached,想到自己前几年以前会把内存分配及调用和程序写在一起.确实是不合理的.这样的话,主进程就会越来越大,而且模块也不是完全独立.不能做到松耦合. 实质就是把内存的读写I/ ...