BZOJ5299 CQOI2018 解鎖螢幕

2022-02-06 02:16:42 字數 1770 閱讀 4407

使用過android手機的同學一定對手勢解鎖螢幕不陌生。android的解鎖螢幕由3x3個點組成,手指在螢幕上畫一條

線將其中一些點連線起來,即可構成乙個解鎖圖案。如下面三個例子所示:

畫線時還需要遵循一些規則

1.連線的點數不能少於4個。也就是說只連線兩個點或者三個點會提示錯誤。

2.兩個點之間的連線不能彎曲。

3.每個點只能"使用"一次,不可重複。這裡的"使用"是指手指劃過乙個點,該點變綠。

4.兩個點之間的連線不能"跨過"另乙個點,除非那個點之前已經被"使用"過了。

對於最後一條規則,參見下圖的解釋。左邊兩幅圖違反了該規則:而右邊兩幅圖(分別為2→4→1→3→6和→5→4→1→9→2)

則沒有違反規則,因為在"跨過"點時,點已經被"使用"過了。

現在工程師希望改進解鎖螢幕,增減點的數目,並移動點的位置,不再是乙個九宮格形狀,但保持上述畫線的規則不變。

請計算新的解鎖螢幕上,一共有多少滿足規則的畫線方案。

輸入檔案第一行,為乙個整數n,表示點的數目。

接下來n行,每行兩個空格分開的整數xi和yi,表示每個點的座標。

-1000≤xi,yi≤l000,1≤n<20。各點座標不相同

輸出檔案共一行,為題目所求方案數除以100000007的餘數。

40 0

1 12 2

3 38

解釋:設4個點編號為1到4,方案有1→2→3→4,2→1→3→4,3→2→1→4,2→3→1→4,

及其映象4→3→2→1,3→4→2→1,2→3→4→1,3→2→4→1.

開始把n的範圍看成10了,re了好久才發現...

然後又卡精度wa了好久才發現...

就是設f[i][s]表示已選集合狀態為s, 最後乙個選擇的點是i的方案總數。

先預處理出來sit[i][j]表示要連線i和j需要提前連起來的點的集合。

然後就隨便轉移了...

最後統計答案的時候要注意一下。

這題沒有別人說的那麼卡常(我自帶小常數), 就是卡精度。

總體來說比較水,甚至放在noip都比較水。

#include #include 

#include

#include

#include

#include

using

namespace

std;

#define reg register

#define mod 100000007 inline

intread()

while(isdigit(ch))res=(res<<3)+(res<<1)+(ch^48),ch=getchar();

return flag?-res:res;

}int n, x[22], y[22

];int sit[22][22], bin[22

];int f[22][1

<<22

];int

ans;

signed main()}}

}for (reg int i = 1 ; i <= n ; i ++) f[i][bin[i-1]] = 1

;

for (reg int s = 0 ; s <= (1

<< (n)) - 1 ; s ++)}}

for (reg int s = 0 ; s <= (1

<< (n)) - 1 ; s ++)

printf(

"%d\n

", ans);

return0;

}

bzoj5299 狀壓DP 解鎖螢幕

description 使用過android手機的同學一定對手勢解鎖螢幕不陌生。android的解鎖螢幕由3x3個點組成,手指在螢幕上畫一條 線將其中一些點連線起來,即可構成乙個解鎖圖案。如下面三個例子所示 畫線時還需要遵循一些規則 1 連線的點數不能少於4個。也就是說只連線兩個點或者三個點會提示錯...

bzoj1257 CQOI 餘數之和

題目 time limit 5 sec memory limit 162 mb submit 2383 solved 1105 submit status discuss 給出正整數n和k,計算j n,k k mod 1 k mod 2 k mod 3 k mod n的值,其中k mod i表示k除...

BZOJ1818 Cqoi2010 內部白點

給定平面上的一些黑點,其它位置都是白點,乙個白點如果上下左右都有黑點就會變成黑點,求最終會有多少個黑點 就是求交點個數 離散化後,取出所有線段,然後沿任意乙個軸朝著乙個方向掃,然後把平行於另乙個軸的線段用端點記錄,掃到一端就在樹狀陣列裡 1,另一端 1,樹狀陣列求個區間和貢獻答案即可 const m...