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. 定时器修改button标题闪烁

    在做一个项目时,用到UIButton来设置接收短信验证码的倒计时,但是用NSTimer来设置标题会出现连续闪烁的问题. 经过测试发现了一下内容,如果只是单独的设置button的titleLabel的内 ...

  2. Java项目生成可执行jar包、exe文件以及在Windows下的安装文件

    1.如何通过eclipse将Java项目生成可执行jar包 首先把在eclipse下的java项目导出jar file 下一步 下一步 下一步 最后点击完成,便生成了可执行的jar文件.可以在刚刚选择 ...

  3. @__CheckForDebuggerJustMyCode@4

    最近在编译一个项目MiniFSWatcher,其中有一部分程序需要安装驱动minispy,编译过程中报错 严重性 代码 说明 项目 文件 行 禁止显示状态 错误 LNK2019 无法解析的外部符号 @ ...

  4. Oracle_高级功能(2) 索引

    1.oracle优化器 优化目标分为4种: choose (选择性) rule (基于规则) first rows(第一行) all rows(所有行) Description:描述sql的执行计划 ...

  5. android开发中一个activity如何调用另一个xml中的控件

    有时候,我们需要在一个activity中使用另一个activity中的控件,这时候就不能直接findViewById,不然会报错指向空对象,这时就需要像下面这样做. LayoutInflater fa ...

  6. Android开发之SharedPreferences的封装

    对于大部分初学者来说,如果想利用SharedPreferences进行数据存储的话大部分人(包括本人)应该会这样: 存储: SharedPreferences sharedPreferences = ...

  7. hdu 5326(基础题) work

    http://acm.hdu.edu.cn/showproblem.php?pid=5326 一道水题,题目大意是在公司里,给出n个员工和目标人数m,然后下面的n-1行是表示员工a管理b,问在这些员工 ...

  8. Android.Tools.Summary

    Android平台上工具的总结 每个工具的详细使用和深入理解参考每个工具相关的blog. 1. Android SDK中提供的工具 http://developer.android.com/tools ...

  9. 比较两个List列表,取得List中不同项返回

    /// <summary> /// 比对模型及属性数组 /// </summary> /// <typeparam name="TM">< ...

  10. git报“commiter email "root@localhost.localdomain"does not match your user account”

    首先检查账户邮箱配置是否正确,检查方法: git config --list 发现邮箱及帐号配置正确,但是git push时仍然报如题错误: 原因:git执行add.commit 时已经记录下了做了该 ...