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用法,棋盘模型)的更多相关文章

  1. 前端-----margin用法(盒子模型里补充)

    margin塌陷问题 当时说到了盒模型,盒模型包含着margin,为什么要在这里说margin呢?因为元素和元素在垂直方向上margin里面有坑. 我们来看一个例子: html结构: <div ...

  2. 最小角回归 LARS算法包的用法以及模型参数的选择(R语言 )

    Lasso回归模型,是常用线性回归的模型,当模型维度较高时,Lasso算法通过求解稀疏解对模型进行变量选择.Lars算法则提供了一种快速求解该模型的方法.Lars算法的基本原理有许多其他文章可以参考, ...

  3. POJ 1185 炮兵阵地 (状压dp)(棋盘dp)

    这题和poj 3254很像,但是更复杂了一些 都属于棋盘里放东西,然后又各种各样的限制,然后求方案或者最大值 (1)上一道题距离要大于1,这道题是大于2.所以判断的时候变成 !(x & (x ...

  4. 暑假集训Day2 状压dp 特殊方格棋盘

    首先声明 : 这是个很easy的题 可这和我会做有什么关系 题目大意: 在n*n的方格棋盘上放置n个车,某些格子不能放,求使它们不能互相攻击的方案总数. 注意:同一行或同一列只能有一个车,否则会相互攻 ...

  5. JavaScript之中Array用法的一些技巧总结

    1.创建一个全部为0,长度为100的数组(ES6) Array(10).fill(0) 2.创建一个长度为100的数组,其中保存0 ~ 99 let array = Array(100).fill(0 ...

  6. ios初识UITableView及简单用法二(模型数据)

    // // ViewController.m // ZQRTableViewTest // // Created by zzqqrr on 17/8/24. // Copyright (c) 2017 ...

  7. javascript Object与Array用法

    引用类型:引用类型是一种数据结构,用于将数据和功能组织在一起.引用类型的值是引用类型的一个实例. 一.Object ECMAScript中的对象其实就是一组数据和功能的结合. Object类型其实是所 ...

  8. poj 3254 Corn Fields (状压dp)(棋盘dp)

    状压dp入门题 因为当前行的状态只和上一行有关 所以可以一行一行来做 因为m <= 12所以可以用二进制来表示放了或者没有放 0表示没放,1表示放 f[i][state]表示第i行状态为stat ...

  9. 数组Array用法

    一 创建数组 // 指定长度(稀疏数组) const arr1 = Array(2); console.log(arr1); const arr2 = new Array(4); console.lo ...

随机推荐

  1. php的ob缓存详解

    前言引入 先看下面的代码: 这个代码,每次输出后都有sleep(1),表示程序执行暂定一秒,想象中浏览器应该是每隔1s钟,逐渐显示1到5的,然后事实情况确不是,浏览器访问的时候,等了5s种后,页面上一 ...

  2. C# 创建WebService的简单示例

    工具Visual Studio 2013 1.创建一个空的Web应用程序. 2.鼠标右击项目,添加->新建项 选择Web服务(ASMX),点击添加.一个简单的webservice就创建完成了.

  3. JQuery UI之Autocomplete(4)多值输入、远程缓存与组合框

    1.多值输入 首先加入相关的css和js文件,以及对应的HTML代码如下: <link href="../css/jquery-ui.css" rel="style ...

  4. rbac 表结构的。设计

    1. 问:为什么程序需要权限控制? 答:生活中的权限限制,① 看灾难片电影<2012>中富人和权贵有权登上诺亚方舟,穷苦老百姓只有等着灾难的来临:② 屌丝们,有没有想过为什么那些长得漂亮身 ...

  5. blockchain good article

    https://medium.com/programmers-blockchain/create-simple-blockchain-java-tutorial-from-scratch-6eeed3 ...

  6. MyEclipse中抽取接口、父类

    选中要抽取接口的类-------->Refactor-------->Extact Interface-------->填写抽取的接口名-------->选择要抽取的方法(一般 ...

  7. c#dev tabcontrol 切换页面时注意的问题

    先加一个代码 public void SetXtraTabPageVisible(DevExpress.XtraTab.XtraTabControl xtraTabControl, bool iIsV ...

  8. hdu (kruska and prime) 继续畅通工程

    题目http://acm.hdu.edu.cn/showproblem.php?pid=1879 复习一下最小生成树的两个基本算法. 由于存在道路是否已修建的问题,如果已修建,那么该条道路的成本即为0 ...

  9. hdu 1754(基础线段树) I Hate It

    http://acm.hdu.edu.cn/showproblem.php?pid=1754 数据比较大,暴力会超时,所以明显是线段树,普通的线段树,结构体中多开一个值sum储存每个子区间的最大成绩, ...

  10. N! (数组)

    #include <iostream> using namespace std; ; int f[MAXN]; int main(){ int n; cin >> n; f[] ...