使用過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...