考虑从$(1,1)$开始搜索移动方案,每次移动坐标的变化量都是$2$。

如果构成了环,那么环的周长肯定是偶数。

考虑这个环一定要被若干个骨牌覆盖,且还有一个位置是空的。

所以得出环的周长是奇数,矛盾,因此这个搜索不会搜出环,从而会得到一棵有根树。

那么答案就是所有关键点加上根节点形成的虚树的边总长$\times 2-$离根最远的关键点到根的距离,DP即可。

时间复杂度$O(nm)$。

#include<cstdio>
const int N=75,M=1230;
char s[N],a[N][N];
int n,m,cnt,i,j,x,y,z,ans,id[N][N],is[M],g[M],nxt[M],v[M],f[M];
inline bool check(char x){return x=='a'||x=='e'||x=='i'||x=='o'||x=='u'||x=='y';}
void dfs(int x,int y,int z,int u){
if(x<1||x>n||y<1||y>m)return;
int o=id[x][y];
v[o]=1;
if(u)nxt[o]=g[u],g[u]=o;
if(z!=2&&a[x][y+1]=='-')dfs(x,y+2,1,o);
if(z!=1&&a[x][y-1]=='-')dfs(x,y-2,2,o);
if(z!=4&&a[x+1][y]=='|')dfs(x+2,y,3,o);
if(z!=3&&a[x-1][y]=='|')dfs(x-2,y,4,o);
}
void dp(int x){
for(int i=g[x];i;i=nxt[i]){
dp(i);is[x]+=is[i];
if(is[i]){
ans+=2;
if(f[i]>=f[x])f[x]=f[i]+1;
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i+=2)for(j=1;j<=m;j+=2)id[i][j]=++cnt;
for(i=1;i<=n;i++)for(scanf("%s",s+1),j=1;j<=m;j++)is[id[i][j]]|=check(s[j]);
for(i=1;i<=n;i++)scanf("%s",a[i]+1);
dfs(1,1,0,0);
for(i=0;i<=cnt;i++)if(is[i]&&!v[i])return puts("NIE"),0;
dp(1);
return printf("%d",ans-f[1]),0;
}

  

BZOJ2990 : [Ontak2010]Keyboard的更多相关文章

  1. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  2. Fedora 22中的Locale and Keyboard Configuration

    Introduction The system locale specifies the language settings of system services and user interface ...

  3. android:configChanges="keyboard|keyboardHidden|orientation|screenSize"

    <activity android:name="xxxActivity" android:configChanges="keyboard|keyboardHidde ...

  4. USB Keyboard Recorder

    catalogue . 引言 . Device Class Definition for Human Interface Devices (HID) . USB HID Report Descript ...

  5. imx6 matrix keyboard

    imx6需要添加4x4的矩阵键盘.本文记录添加方法. 参考链接 http://processors.wiki.ti.com/index.php/TI-Android-JB-PortingGuide h ...

  6. Codeforces Round #389 Div.2 B. Santa Claus and Keyboard Check

    time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standa ...

  7. UVa 11998 Broken Keyboard (数组模拟链表问题)

    题目链接: 传送门 Broken Keyboard #include<bits/stdc++.h> using namespace std; char str[100010]; int m ...

  8. vimium Keyboard Bindings

    Modifier keys are specified as `<c-x>`, `<m-x>`, and `<a-x>` for ctrl+x, meta+x, a ...

  9. UVa 11988 Broken Keyboard(链表->数组实现)

    /*数组形式描述链表:链表不一定要用指针. 题目链接:UVa 11988 Broken Keyboard 题目大意: 小明没有开屏幕输入一个字符串,电脑键盘出现了问题会不定时的录入 home end ...

随机推荐

  1. Linux 下根据进程名kill进程

    脚本方式实现: #!/bin/sh #根据进程名杀死进程 if [ $# -lt 1 ] then echo "缺少参数:procedure_name" exit 1 fi PRO ...

  2. XAML语言介绍

    <Window x:Class="WpfApplication1.Window1" xmlns="http://schemas.microsoft.com/winf ...

  3. 七牛---以一个七牛上传的实例小结下AJAX跨域【转】

    http://blog.csdn.net/netdxy/article/details/50699842 使用七牛过程中,很多用户或多或少遇到跨域的问题,这篇文章主要介绍下跨域的概念来看什么情况下会出 ...

  4. 回溯法解决N皇后问题(以四皇后为例)

    以4皇后为例,其他的N皇后问题以此类推.所谓4皇后问题就是求解如何在4×4的棋盘上无冲突的摆放4个皇后棋子.在国际象棋中,皇后的移动方式为横竖交叉的,因此在任意一个皇后所在位置的水平.竖直.以及45度 ...

  5. Jquery 自定义弹窗等待

    (function ($) { $.extend({ //弹窗蒙层 ShowLoadDialog : function () { ) { var cusrtxt = $("<div i ...

  6. How many Fibs?【sudt 2321】【大数的加法及其比较】

    How many Fibs? Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 Recall the definition of t ...

  7. 图结构练习——最短路径(dijkstra算法(迪杰斯拉特))

      图结构练习——最短路径 Time Limit: 1000ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述  给定一个带权无向图,求节点1到节点n的最短路径.   ...

  8. node 初识

    跟随startup engineering 已经到了week2了,目前为止课程都没有详细介绍node,恐怕以后也不会讲得太细,只是罗列出了一堆阅读材料供你自学.花了点时间阅读些许,在此做个墨迹. Ho ...

  9. loj 1037(状压dp)

    题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=25914 思路:dp[state]表示当前状态下要消耗的最小的sho ...

  10. hdu 并查集分类(待续)

    hdu 1829 A Bug's Life 题目大意: 给你n个动物,输入m行a,b,表示a和b应该是异性的,要你判断是否有同性恋. 并查集中,1到n代表应性别,n+1到2n代表一个性别,合并一下,判 ...