日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

最小操作数,木块砌墙问题

發布時間:2024/1/1 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 最小操作数,木块砌墙问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

第三十二章、最小操作數

? ? 題目詳情如下:

? ? 給定一個單詞集合Dict,其中每個單詞的長度都相同?,F從此單詞集合Dict中抽取兩個單詞A、B,我們希望通過若干次操作把單詞A變成單詞B,每次操作可以改變單詞的一個字母,同時,新產生的單詞必須是在給定的單詞集合Dict中。求所有行得通步數最少的修改方法。

? ?舉個例子如下:
Given:
? ?A = "hit"
? ?B = "cog"
? ?Dict = ["hot","dot","dog","lot","log"]
Return
?[
? ?["hit","hot","dot","dog","cog"],
? ?["hit","hot","lot","log","cog"]
?]
? ? 即把字符串A = "hit"轉變成字符串B = "cog",有以下兩種可能:
"hit" -> "hot" -> ?"dot" -> ?"dog" -> "cog";

"hit" -> ?"hot" -> ?"lot" -> ?"log" ?->"cog"。

? ??詳解:本題是一個典型的圖搜索算法問題。此題看似跟本系列的第29章的字符串編輯距離相似,但其實區別特別大,原因是最短編輯距離是讓某個單詞增加一個字符或減少一個字符或修改一個字符達到目標單詞,來求變換的最少次數,但此最小操作數問題就只是改變一個字符。?

? ? 通過此文:http://blog.csdn.net/v_JULY_v/article/details/6111353,我們知道,在圖搜索算法中,有深度優先遍歷DFS和廣度優先遍歷BFS,而題目中并沒有給定圖,所以需要我們自己建立圖。

? ? 涉及到圖就有這么幾個問題要思考,節點是什么?邊如何建立?圖是有方向的還是無方向的?包括建好圖之后,如何記錄單詞序列等等都是我們要考慮的問題。

? ? 解法一、單向BFS法

? ??1、建圖

? ? 對于本題,我們的圖的節點就是字典里的單詞,兩個節點有連邊,對應著我們可以把一個單詞按照規則變為另外一個單詞。比如我們有單詞hat,它應該與單詞cat有一條連邊,因為我們可以把h變為c,反過來我們也可以把c變為h,所以我們建立的連邊應該是無向的。
? ? ? ? ? ? 如何建圖?有兩種辦法,

  • 第一種方法是:我們可以把字典里的任意兩個單詞,通過循環判斷一下這兩個單詞是否只有一個位置上的字母不同。即假設字典里有n個單詞,我們遍歷任意兩個單詞的復雜度是O(n2),如果每個單詞長度為length,我們判斷兩個單詞是否連邊的復雜度是O(length),所以這個建圖的總復雜度是O(n2*length)。但當n比較大時,這個復雜度非常高,有沒有更好的方法呢?
  • 第二種方法是:我們把字典里地每個單詞的每個位置的字母修改一下,從字典里查找一下(若用基于red-black tree的map查找,其查找復雜度為O(logn),若用基于hashmap的unordered_map,則查找復雜度為O(1)),修改后的單詞是否在字典里出現過。即我們需要遍歷字典里地每一個單詞O(n),嘗試修改每個位置的每個字母,對每個位置我們需要嘗試26個字母(其實是25個,因為要改得和原來不同),因此這部分復雜度是O(26*length),總復雜度是O(26 * n * length) ?第二種方法優化版:這第二種方法能否更優?在第二種方法中,我們對每個單詞每個位置嘗試了26次修改,事實上我們可以利用圖是無向的這一特點,我們對每個位置試圖把該位置的字母變到字典序更大的字母。例如,我們只考慮cat變成hat,而不考慮hat變成cat,因為再之前已經把無向邊建立了。這樣,只進行一半的修改次數,從而減少程序的運行時間。當然這個優化從復雜度上來講是常數的,因此稱為常數優化,此雖算是一種改進,但不足以成為第三種方法,原因是我們經常忽略O背后隱藏的常數。

? ? OK,上面兩種方法孰優孰劣呢?直接比較n2*length 與?26 * n * length的大小。很明顯,通常情況下,字典里的單詞個數非常多,也就是n比較大,因此第二種方法效果會好一些,稍后的參考代碼也會選擇上述第二種方法的優化。

? ??2、記錄單詞序列

? ? 對于最簡單的bfs,我們是如何記錄路徑的?如果只需要記錄一條最短路徑的話,我們可以對每個走到的位置,記錄走到它的前一個位置。這樣到終點后,我們可以不斷找到它的前一個位置。我們利用了最短路徑的一個特點:即第二次經過一個節點的時候,路徑長度不比第一次經過它時短。因此這樣的路徑是沒有圈的。
? ? 但是本題需要記錄全部的路徑,我們第二次經過一個節點時,路徑長度可能會和第一次經過一個節點時路徑長度一樣。這是因為,我們可能在第i層中有多個節點可以到達第(i + 1)層的同一個位置,這樣那個位置有多條路徑都是最短路徑。

? ? 如何解決呢?——我們記錄經過這個位置的前面所有位置的集合。這樣一個節點的前驅不是一個節點,而是一個節點的集合。如此,當我們第二次經過一個第(i+ 1)層的位置時,我們便保留前面那第i層位置的集合作為前驅。

? ??3、遍歷
? ? ? ? ? ? 解決了以上兩個問題,我們最終得到的是什么?如果有解的話,我們最終得到的是從終點開始的前一個可能單詞的集合,對每個單詞,我們都有能得到它的上一個單詞的集合,直到起點。這就是bfs分層之后的圖,我們從終點開始遍歷這個圖的到起點的所有路徑,就得到了所有的解,這個遍歷我們可以采用之前介紹的dfs方法(路徑的數目可能非常多)。
? ? ? ? ? ? 其實,為了簡單起見,我們可以從終點開始bfs,因為記錄路徑記錄的是之前的節點,也就是反向的。這樣最終可以按順序從起點遍歷到終點的所有路徑。

參考代碼如下:

  • //copyright@caopengcs?????
  • //updated@July?08/12/2013????
  • class?Solution????
  • {????
  • public:????
  • ????//?help?函數負責找到所有的路徑????
  • ????void?help(intx,vector<int>?&d,?vector<string>?&word,vector<vector<int>?>?&next,vector<string>?&path,vector<vector<string>?>?&answer)?{????
  • ????????path.push_back(word[x]);????
  • ????????if?(d[x]?==?0)?{???//已經達到終點了????
  • ????????????answer.push_back(path);????
  • ????????}????
  • ????????else?{????
  • ????????????int?i;????
  • ????????????for?(i?=?0;?i?<next[x].size();?++i)?{????
  • ????????????????help(next[x][i],d,?word,?next,path,answer);????
  • ????????????}????
  • ????????}????
  • ????????path.pop_back();???//回溯????
  • ????}????
  • ??
  • ????vector<vector<string>>?findLadders(string?start,?string?end,?set<string>&?dict)????
  • ????{????
  • ??
  • ????????vector<vector<string>?>?answer;????
  • ????????if?(start?==?end)?{???//起點終點恰好相等????
  • ????????????return?answer;????
  • ????????}????
  • ????????//把起點終點加入字典的map????
  • ????????dict.insert(start);????
  • ????????dict.insert(end);????
  • ????????set<string>::iterator?dt;????
  • ????????vector<string>?word;????
  • ????????map<string,int>allword;????
  • ????????//把set轉換為map,這樣每個單詞都有編號了。????
  • ????????for?(dt?=?dict.begin();?dt!=?dict.end();?++dt)?{????
  • ????????????word.push_back(*dt);????
  • ????????????allword.insert(make_pair(*dt,?allword.size()));????
  • ????????}????
  • ??
  • ????????//建立連邊?鄰接表????
  • ????????vector<vector<int>?>?con;????
  • ????????int?i,j,n?=word.size(),temp,len?=?word[0].length();????
  • ????????con.resize(n);????
  • ????????for?(i?=?0;?i?<?n;?++i){????
  • ????????????for?(j?=?0;?j?<len;?++j)?{????
  • ????????????????char?c;????
  • ????????????????for?(c?=word[i][j]?+?1;?c?<=?'z';?++c)?{??//根據上面第二種方法的優化版的思路,讓每個單詞每個位置變更大????
  • ????????????????????char?last?=word[i][j];????
  • ????????????????????word[i][j]?=c;????
  • ????????????????????map<string,int>::iterator?t?=?allword.find(word[i]);????
  • ????????????????????if?(t?!=allword.end())?{????
  • ????????????????????????con[i].push_back(t->second);????
  • ????????????????????????con[t->second].push_back(i);????
  • ????????????????????}????
  • ????????????????????word[i][j]?=last;????
  • ????????????????}????
  • ????????????}????
  • ??
  • ????????}????
  • ??
  • ????????//以下是標準bfs過程????
  • ????????queue<int>?q;????
  • ????????vector<int>?d;????
  • ????????d.resize(n,?-1);????
  • ????????int?from?=?allword[start],to?=?allword[end];????
  • ????????d[to]?=?0;??//d記錄的是路徑長度,-1表示沒經過????
  • ????????q.push(to);????
  • ????????vector<vector<int>?>?next;????
  • ????????next.resize(n);????
  • ????????while?(!q.empty())?{????
  • ????????????int?x?=?q.front(),?now=?d[x]?+?1;????
  • ????????????//now相當于路徑長度??
  • ????????????//當now?>?d[from]時,則表示所有解都找到了??
  • ????????????if?((d[from]?>=?0)&&?(now?>?d[from]))?{????
  • ????????????????break;????
  • ????????????}????
  • ????????????q.pop();????
  • ????????????for?(i?=?0;?i?<con[x].size();?++i)?{????
  • ????????????????int?y?=?con[x][i];????
  • ????????????????//第一次經過y??
  • ????????????????if?(d[y]?<?0)?{??????
  • ????????????????????d[y]?=?now;????
  • ????????????????????q.push(y);????
  • ????????????????????next[y].push_back(x);????
  • ????????????????}????
  • ????????????????//非第一次經過y??
  • ????????????????else?if?(d[y]?==now)?{??//是從上一層經過的,所以要保存????
  • ????????????????????next[y].push_back(x);????
  • ????????????????}????
  • ??
  • ????????????}????
  • ????????}????
  • ????????if?(d[from]?>=?0)?{??//有解????
  • ????????????vector<string>path;????
  • ????????????help(from,?d,word,next,?path,answer);????
  • ????????}????
  • ????????return?answer;????
  • ????}????
  • };????
  • ? ??解法二、雙向BFS法

    ? ? BFS需要把每一步搜到的節點都存下來,很有可能每一步的搜到的節點個數越來越多,但最后的目的節點卻只有一個。后半段的很多搜索都是白耗時間了。

    ? ? 上面給出了單向BFS的解法,但看過此前blog中的這篇文章“A*、Dijkstra、BFS算法性能比較演示”可知:http://blog.csdn.net/v_JULY_v/article/details/6238029,雙向BFS性能優于單向BFS。

    ? ? 舉個例子如下,第1步,是起點,1個節點,第2步,搜到2個節點,第3步,搜到4個節點,第4步搜到8個節點,第5步搜到16個節點,并且有一個是終點。那這里共出現了31個節點。從起點開始廣搜的同時也從終點開始廣搜,就有可能在兩頭各第3步,就相遇了,出現的節點數不超過(1+2+4)*2=14個,如此就節省了一半以上的搜索時間。

    ? ? 下面給出雙向BFS的解法,參考代碼如下:

  • //copyright@fuwutu?6/26/2013??
  • class?Solution??
  • {??
  • public:??
  • ????vector<vector<string>>?findLadders(string?start,?string?end,?set<string>&?dict)??
  • ????{??
  • ????????vector<vector<string>>?result,?result_temp;??
  • ????????if?(dict.erase(start)?==?1?&&?dict.erase(end)?==?1)???
  • ????????{??
  • ????????????map<string,?vector<string>>?kids_from_start;??
  • ????????????map<string,?vector<string>>?kids_from_end;??
  • ??
  • ????????????set<string>?reach_start;??
  • ????????????reach_start.insert(start);??
  • ????????????set<string>?reach_end;??
  • ????????????reach_end.insert(end);??
  • ??
  • ????????????set<string>?meet;??
  • ????????????while?(meet.empty()?&&?!reach_start.empty()?&&?!reach_end.empty())??
  • ????????????{??
  • ????????????????if?(reach_start.size()?<?reach_end.size())??
  • ????????????????{??
  • ????????????????????search_next_reach(reach_start,?reach_end,?meet,?kids_from_start,?dict);??
  • ????????????????}??
  • ????????????????else??
  • ????????????????{??
  • ????????????????????search_next_reach(reach_end,?reach_start,?meet,?kids_from_end,?dict);??
  • ????????????????}??
  • ????????????}??
  • ??
  • ????????????if?(!meet.empty())??
  • ????????????{??
  • ????????????????for?(set<string>::iterator?it?=?meet.begin();?it?!=?meet.end();?++it)??
  • ????????????????{??
  • ????????????????????vector<string>?words(1,?*it);??
  • ????????????????????result.push_back(words);??
  • ????????????????}??
  • ??
  • ????????????????walk(result,?kids_from_start);??
  • ????????????????for?(size_t?i?=?0;?i?<?result.size();?++i)??
  • ????????????????{??
  • ????????????????????reverse(result[i].begin(),?result[i].end());??
  • ????????????????}??
  • ????????????????walk(result,?kids_from_end);??
  • ????????????}??
  • ????????}??
  • ??
  • ????????return?result;??
  • ????}??
  • ??
  • private:??
  • ????void?search_next_reach(set<string>&?reach,?const?set<string>&?other_reach,?set<string>&?meet,?map<string,?vector<string>>&?path,?set<string>&?dict)??
  • ????{??
  • ????????set<string>?temp;??
  • ????????reach.swap(temp);??
  • ??
  • ????????for?(set<string>::iterator?it?=?temp.begin();?it?!=?temp.end();?++it)??
  • ????????{??
  • ????????????string?s?=?*it;??
  • ????????????for?(size_t?i?=?0;?i?<?s.length();?++i)??
  • ????????????{??
  • ????????????????char?back?=?s[i];??
  • ????????????????for?(s[i]?=?'a';?s[i]?<=?'z';?++s[i])??
  • ????????????????{??
  • ????????????????????if?(s[i]?!=?back)??
  • ????????????????????{??
  • ????????????????????????if?(reach.count(s)?==?1)??
  • ????????????????????????{??
  • ????????????????????????????path[s].push_back(*it);??
  • ????????????????????????}??
  • ????????????????????????else?if?(dict.erase(s)?==?1)??
  • ????????????????????????{??
  • ????????????????????????????path[s].push_back(*it);??
  • ????????????????????????????reach.insert(s);??
  • ????????????????????????}??
  • ????????????????????????else?if?(other_reach.count(s)?==?1)??
  • ????????????????????????{??
  • ????????????????????????????path[s].push_back(*it);??
  • ????????????????????????????reach.insert(s);??
  • ????????????????????????????meet.insert(s);??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????????s[i]?=?back;??
  • ????????????}??
  • ????????}??
  • ????}??
  • ??
  • ????void?walk(vector<vector<string>>&?all_path,?map<string,?vector<string>>?kids)??
  • ????{??
  • ????????vector<vector<string>>?temp;??
  • ????????while?(!kids[all_path.back().back()].empty())??
  • ????????{??
  • ????????????all_path.swap(temp);??
  • ????????????all_path.clear();??
  • ????????????for?(vector<vector<string>>::iterator?it?=?temp.begin();?it?!=?temp.end();?++it)??
  • ????????????{??
  • ????????????????vector<string>&?one_path?=?*it;??
  • ????????????????vector<string>&?p?=?kids[one_path.back()];??
  • ????????????????for?(size_t?i?=?0;?i?<?p.size();?++i)??
  • ????????????????{??
  • ????????????????????all_path.push_back(one_path);??
  • ????????????????????all_path.back().push_back(p[i]);??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • };??


  • 第三十三章、木塊砌墻

    題目:用 1×1×1, 1× 2×1以及2×1×1的三種木塊(橫綠豎藍,且綠藍長度均為2),

    搭建高長寬分別為K × 2^N × 1的墻,不能翻轉、旋轉(其中,0<=N<=1024,1<=K<=4)

    有多少種方案,輸出結果

    對1000000007取模。

    舉個例子如給定高度和長度:N=1 K=2,則 答案是7,即有7種搭法,如下圖所示:

    ?

    ? ??詳解:此題很有意思,涉及的知識點也比較多,包括動態規劃,快速矩陣冪,狀態壓縮,排列組合等等都一一考察了個遍。而且跟一個比較經典的矩陣乘法問題類似:即用1 x 2的多米諾骨牌填滿M x N的矩形有多少種方案,M<=5,N<2^31,輸出答案mod p的結果

    OK,回到正題。下文使用的圖示說明(所有看到的都是橫切面):

    首先說明“?方塊”的作用

    “?方塊”,表示這個位置是空位置,可以任意擺放。
    上圖的意思就是,當右上角被綠色木塊占用,此位置固定不變,其他位置任意擺放,在這種情況下的堆放方案數。

    ? ? 解法一、窮舉遍歷

    ? ? 初看此題,你可能最先想到的思路便是窮舉:用二維數組模擬墻,從左下角開始擺放,從左往右,從下往上,最后一個格子是右上角那個位置;每個格子把每種可以擺放木塊都擺放一次,每堆滿一次算一種用擺放方法。為了便于描述,為木塊的每個格子進行編號:

    下面演示當n=1,k=2的算法過程(7種情況):

    ? ? 窮舉遍歷在數據規模比較小的情況下還撐得住,但在0<=N<=1024這樣的數據規模下,此方法則立刻變得有心無力,因此我們得尋找更優化的解法。

    ? ? 解法二、遞歸分解

    遞歸求解就是把一個大問題,分解成小問題,逐個求解,然后再解決大問題。

    2.1、算法演示

    假如有墻規模為(n,k),如果從中間切開,被分為規模問(n-1,k)的兩堵墻,那么被分開的墻和原墻有什么關系呢?我們首先來看一下幾組演示。

    2.1.1、n=1,k=2的情況

    首先演示,n=1,k=2時的情況,如下圖2-1:

    圖 2-1

    上圖2-1中:

    ?表示,左邊墻的所有堆放方案數 * 右邊墻所有堆放方案數 = 2 * 2 = 4

    表示,當切開處有一個橫條的時候,空位置存在的堆放方案數。左邊*右邊 = 1*1 = 2;剩余兩組以此類推。

    這個是排列組合的知識。

    2.1.2、n=2,k=3的情況

    其次,我們再來演示下面更具一般性的計算分解,即當n=2,k=3的情況,如下圖2-2:

    ?圖 2-2

    再從分解的結果中,挑選一組進行分解演示:

    ?圖 2-3

    通過圖2-2和圖2-3的分解演示,可以說明,最終都是分解成一列求解。在逐級向上匯總。

    2.1.3、n=4,k=3的情況

    我們再假設一堵墻n=4,k=3,也就是說,寬度是16,高度是3時,會有以下分解:

    圖2-4

    根據上面的分解的一個中間結果,再進行分解,如下:

    圖 2-5

    ? ? 通過上面圖2-1~圖2-5的演示可以明確如下幾點:

  • 假設f(n)用于計算問題,那么f(n)依賴于f(n-1)的多種情況。
  • 切開處有什么特殊的地方呢?通過上面的演示,我們得知被切開的兩堵墻從沒有互相嵌入的木塊(綠色木塊)到全是互相連接的木塊,相當于切口綠色木塊的全排列(即有綠色或者沒有綠色的所有排列),即有2^k種狀態(比如k=2,且有綠色用1表示,沒有綠色用0表示,那么就有00、01、10、11這4種狀態)。根據排列組合的性質,把每一種狀態下左右木墻堆放方案數相乘,再把所有乘積求和,就得到木墻的堆放結果數。以此類推,將問題逐步往下分解即可。
  • 此外,從圖2-5中可以看出,除了需要考慮切口綠色木塊的狀態,還需要考慮最左邊一列和最右邊一列的綠色木塊狀態。我們把這兩種邊界狀態稱為左邊界狀態和右邊界狀態,分別用leftStaterightState表示。?
  • 且在觀察圖2-5被切分后,所有左邊的墻,他們的左邊界ls狀態始終保持不變,右邊界rs狀態從0~maxState, maxState = 2^k-1(有綠色方塊表示1,沒有表示0;ls表示左邊界狀態,rs表示右邊狀態):

    圖 2-6

    ?同樣可以看出右邊的墻的右邊界狀態保持不變,而左邊界狀態從0~maxState。要堆砌的木墻可以看做是左邊界狀態=0,和右邊界狀態=0的一堵墻。

    ? ??有一點可能要特別說明下,即上文中說,有綠色方塊的狀態表示標為1,無綠色方塊的狀態表示標為0,特意又拿上圖2-6標記了一些數字,以讓絕大部分讀者能看得一目了然,如下所示:

    ? ? ? ?

    ? 圖2-7

    這下,你應該很清楚的看到,在上圖中,左邊木塊的狀態表示一律為010,右邊木塊的狀態表示則是000~111(即從下至上開始計數,右邊木塊rs的狀態用二進制表示為:000 001 010 011 100 101 110 111,它們各自分別對應整數則是:0 1 2 3 4 5 6 7)。

    2.2、計算公式

    通過圖2-4、圖2-5、圖2-6的分解過程,我們可以總結出下面公式(leftState=最左邊邊界狀態,rightState=最右邊邊界狀態):

    即:

    ? ? 接下來,分3點解釋下上述公式:

    ? ??1、上述函數返回結果是當左邊狀態為=leftState,右邊狀態=rightState時木墻的堆砌方案數,相當于直接分解的左右狀態都為0的情況,即直接分解f(n,k,0,0)即可 ??吹竭@,讀者可能便有疑問了,既然直接分解f(n,k,0,0)即可,為何還要加leftstate和leftstate兩個變量呢?回顧下2.1.3節中n=4,k=3的演示例子,即當n=4,k=3時,其分解過程即如下圖( 上文2.1.3節中的圖2-4
    ? ? 也就是說,剛開始直接分解f(4,3,0,0),即n=4,k=3,leftstate=0,rightstate=0,但分解過程中leftstate和rightstate皆從0變化到了maxstate,故才讓函數的第3和第4個參數采用leftstate和rightstate這兩個變量的形式,公式也就理所當然的寫成了f(n,k,leftstate,rightstate)。
    ? ??2、然后我們再看下當n=4,k=3分解的一個中間結果,即給定如上圖最下面部分中紅色框框所框住的木塊時

    ?

    它用方程表示即為?f(2,3,2,5),怎么得來的呢?其實還是又回到了上文2.1.3節中,當n=2,k=3 時(下圖即為上文2.1.3節中的圖2-5和圖2-6


    ? ? 左邊界ls狀態始終保持不變時,右邊界rs狀態從0~maxState;右邊界狀態保持不變時,而左邊界狀態從0~maxState。

    ? ? 故上述分解過程用方程式可表示為:

    f(2,3,2,5) = f(1,3,2,0) * f(1,3,0,5)
    ? ? ? ? ? ? + f(1,3,2,1) * f(1,3,1,5)
    ? ? ? ? ? ?+ f(1,3,2,2) * f(1,3,2,5)
    ? ? ? ? ? ? + f(1,3,2,3) * f(1,3,3,5)
    ? ? ? ? ? ?+ f(1,3,2,4) * f(1,3,4,5)
    ? ? ? ? ? ?+ f(1,3,2,5) * f(1,3,5,5)
    ? ? ? ? ? ? + f(1,3,2,6) * f(1,3,6,5)
    ? ? ? ? ? ? + f(1,3,2,7) * f(1,3,7,5)

    ? ? 說白了,我們曾在2.1節中從圖2-2到圖2-6正推推導出了公式,然上述過程中,則又再倒推推了一遍公式進行了說明。
    ?3、最后,作者是怎么想到引入 leftstate 和rightstate 這兩個變量的呢?如紅色標記所說:"因為切開后,發現綠色條,在分開出不斷的變化,當時也進入了死胡同,我就在想,藍色的怎么辦。后來才想明白,與藍色無關。每一種變化就是一種狀態,所以就想到了引入leftstate 和rightstate這兩個變量。"

    2.3、參考代碼

    下面代碼就是根據上面函數原理編寫的。最終執行效率,n=1024,k=4 時,用時0.2800160秒(之前代碼用的是字典作為緩存,用時在1.3秒左右,后來改為數組結果,性能大增)。

  • //copyright@紅色標記?12/8/2013????
  • //updated@July?13/8/2013??
  • using?System;????
  • using?System.Collections.Generic;????
  • using?System.Text;????
  • using?System.Collections;????
  • ??
  • namespace?HeapBlock????
  • {????
  • ????public?class?WoolWall????
  • ????{????????????
  • ????????private?int?n;????
  • ????????private?int?height;????
  • ????????private?int?maxState;????
  • ????????private?int[,?,]?resultCache;???//結果緩存數組????
  • ??
  • ????????public?WoolWall(int?n,?int?height)????
  • ????????{????
  • ????????????this.n?=?n;????
  • ????????????this.height?=?height;????
  • ????????????maxState?=?(1?<<?height)?-?1;????
  • ????????????resultCache?=?new?int[n?+?1,?maxState?+?1,?maxState?+?1];???//構建緩存數組,每個值默認為0;????
  • ????????}????
  • ??
  • ????????///?<summary>????
  • ????????///?靜態入口。計算堆放方案數。????
  • ????????///?</summary>????
  • ????????///?<param?name="n"></param>????
  • ????????///?<param?name="k"></param>????
  • ????????///?<returns></returns>????
  • ????????public?static?int?Heap(int?n,?int?k)????
  • ????????{????
  • ????????????return?new?WoolWall(n,?k).Heap();????
  • ????????}????
  • ??
  • ????????///?<summary>????
  • ????????///?計算堆放方案數。????
  • ????????///?</summary>????
  • ????????///?<returns></returns>????
  • ????????public?int?Heap()????
  • ????????{????
  • ????????????return?(int)Heap(n,?0,?0);????
  • ????????}????
  • ??
  • ????????private?long?Heap(int?n,?int?lState,?int?rState)????
  • ????????{????
  • ????????????//如果緩存數組中的值不為0,則表示該結果已經存在緩存中。????
  • ????????????//直接返回緩存結果。????
  • ????????????if?(resultCache[n,?lState,?rState]?!=?0)????
  • ????????????{????
  • ????????????????return?resultCache[n,?lState,?rState];????
  • ????????????}????
  • ??
  • ????????????//在只有一列的情況,無法再進行切分????
  • ????????????//根據列狀態計算一列的堆放方案????
  • ????????????if?(n?==?0)????
  • ????????????{????
  • ????????????????return?CalcOneColumnHeapCount(lState);????
  • ????????????}????
  • ??
  • ????????????long?result?=?0;????
  • ????????????for?(int?state?=?0;?state?<=?maxState;?state++)????
  • ????????????{????
  • ????????????????if?(n?==?1)????
  • ????????????????{????
  • ????????????????????//在只有兩列的情況,判斷當前狀態在切分之后是否有效????
  • ????????????????????if?(!StateIsAvailable(n,?lState,?rState,?state))????
  • ????????????????????{????
  • ????????????????????????continue;????
  • ????????????????????}????
  • ????????????????????result?+=?Heap(n?-?1,?state?|?lState,?state?|?lState)??//合并狀態。因為只有一列,所以lState和rState相同。????
  • ????????????????????????*?Heap(n?-?1,?state?|?rState,?state?|?rState);????
  • ????????????????}????
  • ????????????????else????
  • ????????????????{????
  • ????????????????????result?+=?Heap(n?-?1,?lState,?state)?*?Heap(n?-?1,?state,?rState);?????
  • ????????????????}????
  • ????????????????result?%=?1000000007;//為了防止結果溢出,根據題目要求求模。????
  • ????????????}????
  • ??
  • ????????????resultCache[n,?lState,?rState]?=?(int)result;???//將結果寫入緩存數組中????
  • ????????????resultCache[n,?rState,?lState]?=?(int)result;???//對稱的墻結果相同,所以直接寫入緩存。????
  • ????????????return?result;????
  • ????????}????
  • ??
  • ????????///?<summary>????
  • ????????///?根據一列的狀態,計算列的堆放方案數。????
  • ????????///?</summary>????
  • ????????///?<param?name="state">狀態</param>????
  • ????????///?<returns></returns>????
  • ????????private?int?CalcOneColumnHeapCount(int?state)????
  • ????????{????
  • ????????????int?sn?=?0;?//連續計數????
  • ????????????int?result?=?1;????
  • ????????????for?(int?i?=?0;?i?<?height;?i++)????
  • ????????????{????
  • ????????????????if?((state?&?1)?==?0)????
  • ????????????????{????
  • ????????????????????sn++;????
  • ????????????????}????
  • ????????????????else????
  • ????????????????{????
  • ????????????????????if?(sn?>?0)????
  • ????????????????????{????
  • ????????????????????????result?*=?CalcAllState(sn);????
  • ????????????????????}????
  • ????????????????????sn?=?0;????
  • ????????????????}????
  • ????????????????state?>>=?1;????
  • ????????????}????
  • ????????????if?(sn?>?0)????
  • ????????????{????
  • ????????????????result?*=?CalcAllState(sn);????
  • ????????????}????
  • ??
  • ????????????return?result;????
  • ????????}????
  • ??
  • ????????///?<summary>????
  • ????????///?類似于斐波那契序列。????
  • ????????///?f(1)=1????
  • ????????///?f(2)=2????
  • ????????///?f(n)?=?f(n-1)*f(n-2);????
  • ????????///?只是初始值不同。????
  • ????????///?</summary>????
  • ????????///?<param?name="k"></param>????
  • ????????///?<returns></returns>????
  • ????????private?static?int?CalcAllState(int?k)????
  • ????????{????
  • ????????????return?k?<=?2???k?:?CalcAllState(k?-?1)?+?CalcAllState(k?-?2);????
  • ????????}????
  • ??
  • ????????///?<summary>????
  • ????????///?判斷狀態是否可用。????
  • ????????///?當n=1時,分割之后,左墻和右邊墻只有一列。????
  • ????????///?所以state的狀態碼可能會覆蓋原來的邊緣狀態。????
  • ????????///?如果有覆蓋,則該狀態不可用;沒有覆蓋則可用。????
  • ????????///?當n>1時,不存在這種情況,都返回狀態可用。????
  • ????????///?</summary>????
  • ????????///?<param?name="n"></param>????
  • ????????///?<param?name="lState">左邊界狀態</param>????
  • ????????///?<param?name="rState">右邊界狀態</param>????
  • ????????///?<param?name="state">切開位置的當前狀態</param>????
  • ????????///?<returns>狀態有效返回?true,狀態不可用返回?false</returns>????
  • ????????private?bool?StateIsAvailable(int?n,?int?lState,?int?rState,?int?state)????
  • ????????{????
  • ????????????return?(n?>?1)?||?((lState?|?state)?==?lState?+?state?&&?(rState?|?state)?==?rState?+?state);????
  • ????????}????
  • ????}????
  • }????
  • 上述程序中,

    • WoolWall.Heap(1024,4); //直接通過靜態方法獲得結果
    • new??WoolWall(n, k).Heap();//通過構造對象獲得結果

    2.3.1、核心算法講解

    ? ??因為它最終都是分解成一列的情況進行處理,這就會導致很慢。為了提高速度,本文使用了緩存機制來提高性能。緩存原理就是,n,k,leftState,rightState相同的墻,返回的結果肯定相同。利用這個特性,每計算一種結果就放入到緩存中,如果下次計算直接從緩存取出。剛開始緩存用字典類實現,有網友給出了更好的緩存方法——數組。這樣性能好了很多,也更加簡單。程序結構如下圖所示:

    ? ? 上圖反應了Heep調用的主要方法調用,在循環中,result 累加 lResult 和 rResult。

    ①在實際代碼中,首先是從緩存中讀取結果,如果沒有緩存中讀取結果在進行計算。?

    分解法分解到一列時,不在分解,直接計算機過

  • if?(n?==?0)??
  • {??
  • ?????return?CalcOneColumnHeap(lState);??
  • }??
  • ②下面是整個程序的核心代碼,通過for循環,求和state=0到state=2^k-1的兩邊木墻乘積:

  • for?(int?state?=?0;?state?<=?maxState;?state++)??
  • {??
  • ????if?(n?==?1)??
  • ????{??
  • ????????if?(!StateIsAvailable(n,?lState,?rState,?state))??
  • ????????{??
  • ????????????continue;??
  • ????????}??
  • ????????result?+=?Heap(n?-?1,?state?|?lState,?state?|?lState)?*??
  • ????????????Heap(n?-?1,?state?|?rState,?state?|?rState);??
  • ????}??
  • ????else??
  • ????{??
  • ????????result?+=?Heap(n?-?1,?lState,?state)??
  • ????????????*?Heap(n?-?1,?state,?rState);??
  • ????}??
  • ????result?%=?1000000007;??
  • }??
  • ? ? 當n=1切分時,需要特殊考慮。如下圖:

    圖2-8

    ? ? 看上圖中,因為左邊墻中間被綠色方塊占用,所以在(1,0)-(1,1)這個位置(位置的標記方法同解法一)不能再放綠色方塊。所以一些狀態需要排除,如state=2需要排除。同時在還需要合并狀態,如state=1時,左邊墻的狀態=3。

    ? ??特別說明下:依據我們上文2.2節中的公式,如果第i行有這種木塊,state對應2^(i-1),加上所有行的貢獻就得到state(0就是沒有這種橫跨木塊,2^k-1就是所有行都是橫跨木塊),然后遍歷state,還記得上文中的圖2-7么?

    ? ??當第i行被這樣的木塊或這樣的木塊占據時,其各自對應的state值分別為:

  • 當第1行被占據,state=1;
  • 當第2行被占據,state=2;
  • 當第1和第2行都被占據,state=3;
  • 當第3行被占據,state=4;
  • 當第1和第3行被占據,state=5;
  • 當第2和第3行被占據,state=6;
  • 當第1、2、3行全部都被占據,state=7。
  • ? ? 至于原因,即如2.1.3節節末所說:二進制表示為:000 001 010 011 100 101 110 111,它們各自分別對應整數則是:0 1 2 3 4 5 6 7。

    ? ? 具體來說,下面圖中所有框出來的位置,不能有綠色的:


    ③CalcOneColumnHeap(int state)函數用于計算一列時擺放方案數。

    ? ? 計算方法是, 求和被綠色木塊分割開的每一段連續方格的擺放方案數。每一段連續的方格的擺放方案通過CalcAllState方法求得。經過分析,可以得知CalcAllState是類似斐波那契序列的函數。

    ? ? 舉個例子如下(分步驟講述):

  • 令state = 4546(state=2^k-1,k最大為4,故本題中state最大在15,而這里取state=4546只是為了演示如何計算),二進制是:1000111000010。位置上為1,表示被綠色木塊占用,0表示空著,可以自由擺放。
  • 1000111000010? 被分割后 1? 000? 111? 0000? 1? 0, 那么就有 000=3個連續位置, 0000=4個連續位置?, 0=1個連續位置。
  • 堆放結果=CalcAllState(3) + CalcAllState(4) + CalcAllState(1) = 3 + 5 + 1 = 9。
  • 2.4、再次優化

    ? ? 上面程序因為調用性能的樹形結構,形成了大量的函數調用和緩存查找,所以其性能不是很高。 為了得到更高的性能,可以讓所有的運算直接依賴于上一次運算的結果,以防止更多的調用。即如果每次運算都算出所有邊界狀態的結果,那么就能為下一次運算提供足夠的信息。后續優化請查閱此文第3節:http://blog.csdn.net/dw14132124/article/details/9038417#t2。

    ? 解法三、動態規劃

    相信讀到上文,不少讀者都已經意識到這個問題其實就是一個動態規劃問題,接下來咱們換一個角度來分析此問題。

    3.1、暴力搜索不可行

    首先,因為木塊的寬度都是1,我們可以想成2維的問題。也就是說三種木板的規格分別為1* 1, 1 * 2, 2 * 1。

    ? ? ?通過上文的解法一,我們已經知道這個問題最直接的想法就是暴力搜索,即對每個空格嘗試放置哪種木板。但是看看數據規模就知道,這種思路是不可行的。因為有一條邊范圍長度高達21024,普通的電腦,230左右就到極限了。于是我們得想想別的方法。

    3.2、另辟蹊徑

    ? ? 為了方便,我們把墻看做有2n行,k列的矩形。這是因為雖然矩形木塊不能翻轉,但是我們同時擁有1*2和2*1的兩種木塊。

    ? ? 假設我們從上到下,從左到右考慮每個1*1的格子是如何被覆蓋的。顯然,我們每個格子都要被覆蓋住。木塊的特點決定了我們覆蓋一個格子最多只會影響到下一行的格子。這就可以讓我們暫時只考慮兩行。

    ? ? 假設現我們已經完全覆蓋了前(i– 1)行。那么由于覆蓋前(i-1)行導致第i行也不“完整”了。如下圖:

    xxxxxxxxx

    ooxooxoxo

    我們用x表示已經覆蓋的格子,o表示沒覆蓋的格子。為了方便,我們使用9列。

    ? ? 我們考慮第i行的狀態,上圖中,第1列我們可以用1*1的覆蓋掉,也可以用1*2的覆蓋前兩列。第4、5列的覆蓋方式和第1、2列是同樣的情況。第7列需要覆蓋也有兩種方式,即用1*1的覆蓋或者用2*1的覆蓋,但是這樣會導致第(i+1)行第7列也被覆蓋。第9列和第7列的情況是一樣的。這樣把第i行覆蓋滿了之后,我們再根據第(i+1)行被影響的狀態對下一行進行覆蓋。

    ? ? 那么每行有多少種狀態呢?顯然有2k,由于k很小,我們只有大約16種狀態。如果我們對于這些狀態之間的轉換制作一個矩陣,矩陣的第i行第j列的數表示的是我們第m行是狀態i,我們把它完整覆蓋掉,并且使得第(m + 1)行變成狀態j的可能的方法數,這個矩陣我們可以暴力搜索出來,搜索的方式就是枚舉第m行的狀態,然后嘗試放木板,用所有的方法把第m行覆蓋掉之后,下一行的狀態。當然,我們也可以認為只有兩行,并且第一行是2k種狀態的一種,第二行起初是空白的,求使得第一行完全覆蓋掉,第二行的狀態有多少種類型以及每種出現多少次。

    3.3、動態規劃

    ? ? 這個矩陣作用很大,其實我們覆蓋的過程可以認為是這樣:第一行是空的,我們看看把它覆蓋了,第2行是什么樣子的。根據第二行的狀態,我們把它覆蓋掉,看看第3行是什么樣子的。

    ? ? 如果我們知道第i行的狀態為s,怎么考慮第i行完全覆蓋后,第(i+1)行的狀態?那只要看那個矩陣的狀態s對應的行就可以了。我們可以考慮一下,把兩個這樣的方陣相乘得到得結果是什么。這個方陣的第i行第j個元素是這樣得到的,是第i行第k個元素與第k行第j個元素的對k的疊加。它的意義是上一行是第m行是狀態i,把第m行和第(m+ 1)行同時覆蓋住,第(m+2)行的狀態是j的方法數。這是因為中間第(m+1)行的所有狀態k,我們已經完全遍歷了。

    ? ? 于是我們發現,每做一次方陣的乘法,我們相當于把狀態推動了一行。那么我們要坐多少次方陣乘法呢?就是題目中墻的長度2n,這個數太大了。但是事實上,我們可以不斷地平方n次。也就是說我們可以算出A2,A4, A8, A16……方法就是不斷用結果和自己相乘,這樣乘n次就可以了。

    ? ? 因此,我們最關鍵的問題就是建立矩陣A。我們可以這樣表示一行的狀態,從左到右分別叫做第0列,第1列……覆蓋了我們認為是1,沒覆蓋我們認為是0,這樣一行的狀態可以表示維一個整數。某一列的狀態我們可以用為運算來表示。例如,狀態x第i列是否被覆蓋,我們只需要判斷x & (1 << i) 是否非0即可,或者判斷(x >> i) & 1, 用右移位的目的是防止溢出,但是本題不需要考慮溢出,因為k很小。 接下來的任務就是遞歸嘗試放置方案了

    3.4、參考代碼

    ? ? 最終結果,我們最初的行是空得,要求最后一行之后也不能被覆蓋,所以最終結果是矩陣的第[0][0]位置的元素。另外,本題在乘法過程中會超出32位int的表示范圍,需要臨時用C/C++的long long,或者java的long。

    參考代碼如下:
  • //copyright@caopengcs?12/08/2013??
  • #ifdef?WIN32??
  • #define?ll?__int64???
  • #else??
  • #define?ll?long?long??
  • #endif??
  • ??
  • //?1?covered?0?uncovered??
  • ??
  • void?cal(int?a[6][32][32],int?n,int?col,int?laststate,int?nowstate)?{??
  • ????if?(col?>=?n)?{??
  • ????????++a[n][laststate][nowstate];??
  • ????????return;??
  • ????}??
  • ????//不填?或者用1*1的填??
  • ????cal(a,n,?col?+?1,?laststate,?nowstate);??
  • ????if?(((laststate?>>?col)?&?1)?==?0)?{??
  • ????????cal(a,n,?col?+?1,?laststate,?nowstate?|?(1?<<?col));??
  • ????????if?((col?+?1?<?n)?&&?(((laststate?>>?(col?+?1))?&?1)?==?0))?{??
  • ????????????cal(a,n,?col?+?2,?laststate,?nowstate);??
  • ????????}??
  • ????}??
  • }??
  • ??
  • inline?int?mul(ll?x,?ll?y)?{??
  • ????return?x?*?y?%?1000000007;??
  • }??
  • ??
  • void?multiply(int?n,int?a[][32],int?b[][32])?{?//?b?=?a?*?a??
  • ????int?i,j,?k;??
  • ????for?(i?=?0;?i?<?n;?++i)?{??
  • ????????for?(j?=?0;?j?<?n;?++j)?{??
  • ????????????for?(k?=?b[i][j]?=?0;?k?<?n;?++k)?{??
  • ????????????????if?((b[i][j]?+=?mul(a[i][k],a[k][j]))?>=?1000000007)?{??
  • ????????????????????b[i][j]?-=?1000000007;??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • }??
  • ??
  • int?calculate(int?n,int?k)?{??
  • ????int?i,?j;??
  • ????int?a[6][32][32],mat[2][32][32];??
  • ????memset(a,0,sizeof(a));??
  • ????for?(i?=?1;?i?<=?5;?++i)?{??
  • ????????for?(j?=?(1?<<?i)?-?1;?j?>=?0;?--j)?{??
  • ????????????cal(a,i,?0,?j,?0);??
  • ????????}??
  • ????}??
  • ????memcpy(mat[0],?a[k],sizeof(mat[0]));??
  • ????k?=?(1?<<?k);??
  • ????for?(i?=?0;?n;?--n)?{??
  • ????????multiply(k,?mat[i],?mat[i?^?1]);??
  • ????????i?^=?1;??
  • ????}??
  • ????return?mat[i][0][0];??
  • }??


  • 參考鏈接及推薦閱讀

  • caopengcs,最小操作數:http://blog.csdn.net/caopengcs/article/details/9919341
  • caopengcs,木塊砌墻:http://blog.csdn.net/caopengcs/article/details/9928061;
  • 紅色標記,木塊砌墻:http://blog.csdn.net/dw14132124/article/details/9038417
  • LoveHarvy,木塊砌墻:http://blog.csdn.net/wangyan_boy/article/details/9131501
  • 在線編譯測試木塊砌墻問題:http://hero.pongo.cn/Question/Details?ID=36&ExamID=36;
  • 編程藝術第29章字符串編輯距離:http://blog.csdn.net/v_july_v/article/details/8701148#t4
  • matrix67,十個利用矩陣乘法解決的經典題目:http://www.matrix67.com/blog/archives/276
  • leetcode上最小操作數一題:http://leetcode.com/onlinejudge#question_126
  • hero上木塊砌墻一題:http://hero.pongo.cn/Question/Details?ExamID=36&ID=36&bsh_bid=273040296
  • 超然煙火,http://blog.csdn.net/sunnianzhong/article/details/9326289
  • 總結

    以上是生活随笔為你收集整理的最小操作数,木块砌墙问题的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    国产精品久久久久久影院 | 97在线播放视频 | 久久久久久久免费观看 | 亚洲综合涩| 国内精品久久久久久久影视麻豆 | 黄色网在线免费观看 | 日韩在线观看精品 | 在线观看免费av网站 | 精品国产一区二区三区不卡 | 久久九九国产精品 | 欧美aa在线| 美女视频免费一区二区 | 成人av网站在线 | 天天做天天干 | 成人在线一区二区三区 | 国产免费一区二区三区最新 | 美腿丝袜一区二区三区 | 亚洲精品一区中文字幕乱码 | 日韩一区二区免费播放 | 久久精品视频中文字幕 | 五月婷婷激情综合 | 在线黄av| 亚洲激情在线视频 | 热99在线视频 | 国产91精品一区二区绿帽 | 国产尤物一区二区三区 | 91探花系列在线播放 | 亚洲精品美女久久久 | 国产区在线 | 亚洲视频电影在线 | 日日干天天 | 成人av播放 | 久久午夜免费视频 | 天天干,天天射,天天操,天天摸 | 在线观看91网站 | 欧美少妇xx | 久久小视频 | 91久久国产自产拍夜夜嗨 | 国内久久看 | 久久久久久久久久久免费 | 激情五月av| 午夜在线国产 | 久草在线中文视频 | 国产中文在线视频 | 免费久久网站 | 日韩欧美精品在线 | 亚洲一区精品二人人爽久久 | 国产精品美女视频 | 亚洲一区二区麻豆 | 日韩欧美在线播放 | 狠狠五月婷婷 | 亚洲手机av| 久久在线免费观看 | 日韩激情av在线 | 国产裸体永久免费视频网站 | 精品国产一区二区三区四 | 米奇狠狠狠888| 四虎国产精品永久在线国在线 | 91桃色国产在线播放 | 国产亚洲人 | 日本丶国产丶欧美色综合 | 国产成人一区在线 | 国产字幕在线播放 | 免费在线观看午夜视频 | 亚洲黄色免费电影 | 久久精品视频网址 | 日韩无在线 | 在线色亚洲 | 欧美在线一二区 | 午夜 在线 | 玖玖玖在线 | 黄色免费网战 | 日本三级香港三级人妇99 | 手机成人av | 婷婷免费视频 | 日本精品中文字幕 | 在线观看涩涩 | 91精品欧美 | 欧美a级在线播放 | 91mv.cool在线观看 | 91精品啪在线观看国产线免费 | 日日夜夜免费精品 | 中文字幕人成乱码在线观看 | 在线观看爱爱视频 | 五月婷婷久久综合 | 九九热99视频 | 亚洲在线成人精品 | 99久久这里只有精品 | 国产免费作爱视频 | 国产一卡久久电影永久 | 国产成人三级在线观看 | 日韩欧美69 | 久久免费精品视频 | 国产精品一区二区三区电影 | 成人aⅴ视频 | 日本xxxx裸体xxxx17 | 欧美地下肉体性派对 | 亚洲精品午夜国产va久久成人 | 黄色性av| 久久久久国产精品厨房 | 久久综合欧美精品亚洲一区 | 免费在线成人 | 9999激情| 午夜精品久久一牛影视 | 日夜夜精品视频 | 狠狠干干| 一区视频在线 | 成人a免费看 | 日批视频在线观看免费 | 成人av网站在线观看 | 热re99久久精品国产99热 | 国产精品一区在线 | 久久亚洲影视 | 成人a免费看 | 国产精品麻豆三级一区视频 | 三级视频国产 | 狠狠色丁香婷婷综合橹88 | 中文视频在线看 | 国产精品18久久久久久久 | 国内久久久久 | 日韩在线观看中文 | 久久精品直播 | 国产精品成人自产拍在线观看 | 男女免费视频观看 | 国产r级在线观看 | 中文一二区 | 久久视频在线免费观看 | 狠狠狠操 | 激情婷婷欧美 | 亚洲国产视频直播 | www在线观看国产 | 91cn国产在线| 欧美日韩精品二区第二页 | 水蜜桃亚洲一二三四在线 | 最近中文字幕大全 | 免费看片网页 | 久色网| 久久精国产| 香蕉视频日本 | 亚洲乱亚洲乱妇 | 免费精品 | 亚洲第一色 | 国产精品久久久久久久av大片 | 国产精品久久久久久久久久久杏吧 | av中文字幕在线播放 | 在线看国产 | 久久高清精品 | 国产精品99久久久久久小说 | 日韩精品一区二区免费视频 | 香蕉久久久久久久 | 久久久久久久av麻豆果冻 | 欧美日韩亚洲精品在线 | 久久久久国产精品视频 | 99精品久久久| 亚洲欧美综合精品久久成人 | 激情av一区二区 | 91在线porny国产在线看 | 久久久久9999亚洲精品 | 免费观看一级成人毛片 | www.色午夜,com | 99色网站| 欧美性一级观看 | 一区二区不卡视频在线观看 | 97电影在线观看 | 久久久这里有精品 | 成人黄色在线播放 | 国产成人久久久久 | 在线韩国电影免费观影完整版 | 天堂av免费观看 | 久久免费视频精品 | 欧美巨乳网 | 四虎成人精品在永久免费 | 麻豆视传媒官网免费观看 | 免费成人av网站 | 91免费版在线| 超碰免费观看 | 天天天天天天干 | 国产精品亚州 | 国产伦精品一区二区三区在线 | 国产成人在线免费观看 | 玖玖爱在线观看 | 久久精品一区二区三 | 久久99精品国产麻豆婷婷 | 日本二区三区在线 | 中文字幕在线影视资源 | 91污污 | 色狠狠干 | 日韩免费福利 | 在线久热 | 婷婷丁香在线视频 | 亚洲视频在线看 | 欧美二区视频 | 国产精品福利一区 | 国产一级视频在线 | 国产永久免费高清在线观看视频 | 福利一区在线视频 | 亚洲精品国产精品99久久 | 999电影免费在线观看 | 中文字幕一区二区三区在线视频 | 久久爱www.| 麻豆影视在线播放 | 久久免费视频这里只有精品 | 香蕉视频日本 | 欧美一级性生活片 | 国产精品一区二区av影院萌芽 | 天天色天天操天天爽 | 国产又黄又猛又粗 | 日本性生活一级片 | 久久综合色一综合色88 | 麻豆一级视频 | 在线草 | 欧美日韩中文国产一区发布 | 日本性久久 | 国产精品嫩草69影院 | 91九色国产视频 | 国产成人三级三级三级97 | 人人爱人人爽 | 欧美一级电影 | 91在线在线观看 | 最新av网址大全 | 人人狠| 天天色综合久久 | 在线免费观看国产精品 | 国产精品一区二区三区视频免费 | 摸bbb搡bbb搡bbbb | av免费在线免费观看 | 欧美调教网站 | 日韩一级电影网站 | 福利视频一二区 | 亚洲免费av在线 | 不卡电影免费在线播放一区 | 国产精品电影一区二区 | 手机看片中文字幕 | 久久国产一区 | 黄色的网站在线 | 亚洲精品一区二区在线观看 | 国产亚洲在线 | 国产视频 亚洲视频 | 中文字幕免 | 日韩欧美91 | 欧美另类巨大 | 国产精品国产三级国产不产一地 | 91视频链接 | 久久精品9 | av免费成人 | 日韩视频免费看 | 91探花在线 | www黄色com| 精品一区二区视频 | 亚洲精品视频在线观看视频 | 中文字幕在线网址 | 亚州国产视频 | 日本特黄特色aaa大片免费 | 欧美日韩一区二区免费在线观看 | 国产精品99精品 | 亚洲婷婷丁香 | 亚洲四虎影院 | 一级欧美一级日韩 | 国产分类视频 | 激情五月播播久久久精品 | 久久精品国产免费看久久精品 | 欧美午夜理伦三级在线观看 | 91成人精品观看 | 婷婷丁香七月 | 黄色小说视频在线 | 中文字幕视频在线播放 | 日韩精品视频免费 | 99爱精品视频 | 天天色天天干天天色 | 香蕉视频最新网址 | 麻豆视频免费版 | 91爱爱电影 | 亚洲天堂网在线视频观看 | 狠狠色丁香久久婷婷综合丁香 | 91成人精品一区在线播放69 | 天天综合网天天综合色 | 免费手机黄色网址 | 福利视频精品 | av黄免费看 | 亚洲精品国产精品乱码不99热 | 欧美视频在线二区 | 国产精品一区二区免费视频 | av先锋影音少妇 | 极品国产91在线网站 | 午夜久久久久 | 日韩久久久久久久久久久久 | 国产人成一区二区三区影院 | 四虎www| av电影中文 | 久久99国产精品视频 | 四虎免费在线观看 | 国产精品久久久久永久免费 | 特级aaa毛片| www亚洲视频 | 成人精品一区二区三区中文字幕 | 免费十分钟| 五月婷视频 | 欧美 日韩 性 | 免费视频99| 99热这里只有精品1 av中文字幕日韩 | 日本精品久久久久中文字幕5 | 亚洲婷婷网 | 日韩欧美精品在线观看 | 四虎www com| 粉嫩av一区二区三区四区在线观看 | 久草在线99 | 国产日本亚洲 | 久久久96 | 人人狠狠综合久久亚洲婷 | 欧美日本不卡高清 | 九九热99视频 | 91网免费观看 | 91完整版 | 久久国内视频 | 又粗又长又大又爽又黄少妇毛片 | 日韩美女黄色片 | www.五月天激情 | 狠狠色丁香婷婷综合最新地址 | 网站在线观看日韩 | 91麻豆免费版 | 在线免费高清 | 久久久高清一区二区三区 | 久久精品福利 | 中文字幕日韩国产 | 毛片永久免费 | 麻豆国产在线播放 | 91探花国产综合在线精品 | 日韩中文字幕一区 | 伊人永久| 亚洲综合在 | 色就色,综合激情 | 国产无遮挡又黄又爽在线观看 | 国产高清中文字幕 | 日本不卡123区 | 国产在线色 | 免费在线国产黄色 | 中文字幕一区在线 | 日韩在线观看第一页 | www.狠狠插.com | 免费开视频 | 欧美999| 国产精品久久久久av免费 | 91成人精品视频 | 久久经典国产 | 亚洲 综合 精品 | 国产精品9区 | 亚洲黄色片 | 麻豆网站免费观看 | 综合网色| 九九视频在线播放 | 在线观看av的网站 | 久久精品一区二区三区中文字幕 | 91综合色 | 91精品国产网站 | 国产精品6| 玖操 | 国产精品久久久久一区 | 日产乱码一二三区别在线 | 在线视频手机国产 | 69av国产 | 一区二区精品国产 | 国产精品h在线观看 | 九色在线视频 | 91亚洲欧美 | 色综合婷婷| a√天堂中文在线 | 日韩三级一区 | 免费日韩一级片 | 国产美女免费观看 | 久久99最新地址 | 成人免费xyz网站 | 亚洲 欧美 综合 在线 精品 | 欧美视频国产视频 | 久艹在线播放 | 国产91精品高清一区二区三区 | 天堂在线一区二区三区 | 精品福利网站 | 九九热在线精品 | 99久久久国产精品 | 天堂在线视频中文网 | 天天射天天射天天射 | 麻豆va一区二区三区久久浪 | 免费电影一区二区三区 | 国产在线精品一区二区 | 国产一级电影在线 | 免费在线观看av网站 | 久久精品国产v日韩v亚洲 | 午夜久久影视 | 免费视频区 | www.亚洲视频.com | 在线观看国产一区 | 日女人电影 | 欧美99精品| 91在线中字| 高清av免费一区中文字幕 | 久久精品1区 | 超碰伊人网| 在线国产一区二区三区 | 9色在线视频 | 久久精品视频一 | 久久精品视频一 | 国产福利一区二区三区在线观看 | 日韩中文字幕第一页 | 国产蜜臀av | 激情深爱.com | 久久爱影视i | 久久国产片 | 日韩欧美在线综合网 | 在线激情网| 亚洲国产日韩一区 | av黄网站| 激情视频综合网 | 欧美视频www | 中文字幕丝袜 | 日日躁夜夜躁aaaaxxxx | 成人中文字幕+乱码+中文字幕 | 日韩网站在线播放 | 国产精品麻豆91 | 一级免费黄视频 | 毛片精品免费在线观看 | 国产免费大片 | 最新av网址大全 | 丁香婷婷综合五月 | 国产精品爽爽久久久久久蜜臀 | 狠狠狠狠狠色综合 | 日批视频在线 | 中文字幕亚洲欧美日韩 | 久久久久国产精品免费网站 | 91精品国产99久久久久 | 日韩av片免费在线观看 | 免费韩国av| 在线观看视频免费播放 | 九草视频在线 | 日韩欧美在线第一页 | 二区三区在线 | 国产二区电影 | 在线免费视频a | 亚洲九九影院 | 九九热免费视频在线观看 | 激情五月婷婷综合网 | 国产精品视频永久免费播放 | 丁香5月婷婷 | 天天操天天吃 | 国产精品久久久久久久久久白浆 | 国产精品69av | 欧美激情综合五月 | 欧美小视频在线观看 | 美女av免费看 | 777视频在线观看 | 久久8精品| 天天草综合网 | 国产一级片免费视频 | 一区视频在线 | 色综合激情久久 | 久久成人久久 | 免费日韩电影 | 欧美日韩另类视频 | 国产喷水在线 | 成 人 黄 色 免费播放 | www.天天色.com| 美女黄久久 | 久久综合福利 | 久久久久北条麻妃免费看 | 亚洲蜜桃在线 | 天天干夜夜擦 | 91在线看黄 | 香蕉在线视频播放网站 | 天堂中文在线视频 | 国产精品毛片一区视频 | 色婷婷九月 | 特级西西444www大精品视频免费看 | 欧美一级性生活视频 | 国产精品久久久久久久久久免费 | www.夜夜操| 黄p在线播放 | 国产一级精品在线观看 | 欧美日韩网址 | 粉嫩一区二区三区粉嫩91 | 国产成人精品国内自产拍免费看 | 91亚洲精品乱码久久久久久蜜桃 | 亚洲黄色影院 | 91天天操| 久久久久久久久久久免费av | 色视频 在线 | 夜夜操网站| 国产黄色av网站 | 亚洲精品毛片一级91精品 | 中文字幕在线字幕中文 | 永久免费看av | 草免费视频 | 日韩av免费在线看 | 日本成人中文字幕在线观看 | 福利视频精品 | 一本大道久久精品懂色aⅴ 五月婷社区 | 五月天狠狠操 | 国产精品私人影院 | 91精品视频免费在线观看 | 96久久 | 亚洲日本一区二区在线 | 欧美一区,二区 | 久久av一区二区三区亚洲 | 精品一二三四在线 | 国产在线精品播放 | 色偷偷888欧美精品久久久 | 91精品国产99久久久久久久 | 中文字幕 第二区 | 人人爽人人看 | 免费日韩视 | 久久亚洲在线 | 久久在视频 | 欧美日韩在线精品一区二区 | www黄| 精品999在线 | 久操伊人| 日本九九视频 | 国产91九色视频 | 中文字幕2021 | 在线国产视频 | 中文字幕成人一区 | 久久精品欧美日韩精品 | 精品国产精品久久一区免费式 | 福利视频网址 | 亚洲永久精品在线观看 | 中文字幕免费一区 | 精品国产一区二区三区四 | 超碰在线1 | 国产在线高清精品 | 免费看黄在线观看 | 特级毛片爽www免费版 | 久久久久女人精品毛片 | 激情欧美网 | 国产品久精国精产拍 | 国产青春久久久国产毛片 | 亚洲精品国产拍在线 | 色香天天 | 欧美日本国产在线观看 | 日韩精品一区二区三区在线播放 | 99久久精品免费看国产 | 91精品在线播放 | 成人影片在线免费观看 | av高清一区二区三区 | 午夜在线观看影院 | 热久久这里只有精品 | 香蕉成人在线视频 | 久久亚洲人| 97人人精品| 欧美极品少妇xbxb性爽爽视频 | 狠狠干夜夜操 | 国产黄色视 | 欧美日韩大片在线观看 | 超碰在线成人 | 九九爱免费视频在线观看 | 五月婷婷激情综合网 | 成人99免费视频 | 91在线91拍拍在线91 | 二区三区毛片 | 亚洲五月六月 | 日韩h在线观看 | 日本中文字幕在线免费观看 | 91视频在线网址 | 欧美日韩中文另类 | 免费亚洲成人 | 又黄又爽又色无遮挡免费 | 免费高清av在线看 | 日韩毛片在线免费观看 | 在线免费观看麻豆视频 | 精品久久亚洲 | 午夜在线观看一区 | 九九爱免费视频在线观看 | 99国产精品视频免费观看一公开 | 女人高潮一级片 | 久久艹在线观看 | 久热色超碰 | 日韩精品三区四区 | 日本在线视频一区二区三区 | 日韩欧美中文 | 国产高清视频在线播放一区 | 久久天天躁夜夜躁狠狠85麻豆 | 99精品视频在线观看播放 | 亚洲精品18p | 亚洲免费婷婷 | av免费在线网站 | 99看视频在线观看 | 国产精品原创在线 | 在线免费视频 你懂得 | 日本久久成人中文字幕电影 | 国产精品露脸在线 | 久久艹综合 | 久久激情网站 | 99久久久久久久 | 久久免费视频这里只有精品 | 日韩av中文在线 | 中文乱幕日产无线码1区 | 97在线视频免费播放 | 国产精品女同一区二区三区久久夜 | 国产精品成人av久久 | 久久亚洲成人网 | 久久久高清| 亚洲欧美视频一区二区三区 | 亚洲激情在线观看 | 国产一区91| 丁香午夜婷婷 | 四虎欧美| 在线成人免费电影 | 狠狠干狠狠艹 | 欧美在线观看视频一区二区三区 | 国产日本在线观看 | 日韩欧在线 | 成人在线电影观看 | 激情在线网站 | 婷婷伊人综合亚洲综合网 | 黄色网址在线播放 | 在线超碰av | 国产精品久久久久aaaa九色 | 亚洲第一av在线播放 | 97国产大学生情侣白嫩酒店 | www.在线观看视频 | 精品少妇一区二区三区在线 | 亚洲欧洲国产视频 | 欧美一级片在线免费观看 | 亚洲精品视频在线免费播放 | 国产精品久久久久久一区二区 | 在线影院av | 久久综合狠狠综合久久狠狠色综合 | 欧美一级专区免费大片 | 伊人射 | 欧美日韩一区二区久久 | 日韩综合在线观看 | 成人av资源在线 | 国产婷婷一区二区 | 国产精品一二三 | 免费麻豆 | 99久高清在线观看视频99精品热在线观看视频 | 免费97视频 | 四虎永久免费网站 | 日韩女同一区二区三区在线观看 | 91九色在线播放 | 国产99区| 色婷婷久久一区二区 | 中文字幕在线观看你懂的 | 欧美极品少妇xxxx | 日韩a欧美 | 国产福利小视频在线 | 青春草免费在线视频 | 色在线免费观看 | 久久电影日韩 | 日韩一级黄色av | 337p西西人体大胆瓣开下部 | 久保带人 | 青春草免费视频 | 91麻豆精品一区二区三区 | 91精品日韩 | 久久男女视频 | 91精品欧美一区二区三区 | 特级aaa毛片| 日韩免费视频在线观看 | 日本激情视频中文字幕 | 亚洲久草网 | 九九久久影院 | 搡bbbb搡bbb视频 | 免费福利在线视频 | 日韩精品一区二区三区中文字幕 | 一级片免费观看 | 亚洲一区二区视频在线播放 | www.香蕉视频 | 91自拍91| 一级性视频 | 狠狠狠综合 | 久久久久免费精品国产小说色大师 | 我要色综合天天 | 久久精品一区二区三区四区 | 日韩成人在线免费观看 | 在线观看亚洲视频 | 国产精品va在线播放 | 91成人免费观看视频 | 99中文字幕在线观看 | 日韩精品免费一线在线观看 | 美女久久精品 | 久久无码av一区二区三区电影网 | 中文字幕在线免费看 | 久久网址 | 91香蕉视频在线 | 国产亚洲免费观看 | 蜜臀久久99精品久久久久久网站 | 欧美成人在线网站 | 97品白浆高清久久久久久 | 最近中文字幕免费视频 | 日韩网站中文字幕 | 日本女人在线观看 | 欧美日本国产在线观看 | 日韩av二区 | 狠狠色丁香婷婷综合橹88 | 在线国产中文字幕 | 日韩在线小视频 | 国产精品黄色 | 国产小视频网站 | 久热只有精品 | 2024av在线播放| 奇米7777狠狠狠琪琪视频 | 亚洲精品高清视频在线观看 | 久久不射电影院 | 91精品国产自产91精品 | 手机色站 | 在线观看精品一区 | 中文字幕二区三区 | 久久夜色精品亚洲噜噜国4 午夜视频在线观看欧美 | 毛片区 | 人人爽人人干 | 国产高清久久久久 | 亚洲欧洲成人精品av97 | 久久精品国产成人 | 免费在线观看国产精品 | 久久九九国产精品 | 日韩精品在线免费观看 | 国产日韩在线观看一区 | 欧美成人手机版 | 99精品国产成人一区二区 | 在线亚洲午夜片av大片 | 韩国av免费在线观看 | 精品96久久久久久中文字幕无 | 久久午夜国产精品 | 国产精品夜夜夜一区二区三区尤 | av免费网站| 精品福利视频在线观看 | 欧美福利视频 | 国产午夜精品一区二区三区嫩草 | 亚洲成人av电影在线 | 天天爽人人爽 | 狠狠操夜夜操 | 日韩中文在线电影 | 中文字幕精品视频 | 久久婷婷色综合 | 欧美精品做受xxx性少妇 | 狠狠干综合| 992tv在线| 五月天综合在线 | 中文字幕av在线免费 | 午夜av在线电影 | 欧美动漫一区二区三区 | 奇米网777| 国产综合视频在线观看 | av线上看 | 婷婷5月色 | 91麻豆精品国产91 | av千婊在线免费观看 | 美女在线观看网站 | 婷婷久月 | 精品亚洲免费 | av一区二区三区在线观看 | 日韩精品aaa | 69精品人人人人 | 成人精品一区二区三区中文字幕 | 香蕉视频在线网站 | 在线观看免费高清视频大全追剧 | 国产91电影在线观看 | 超碰成人网 | 日韩免费在线视频 | 91麻豆高清视频 | 特黄特黄的视频 | 欧美日韩三级在线观看 | 日本中文字幕系列 | 日韩电影久久久 | 深爱激情五月综合 | 国产精品一区二区三区久久久 | 日韩在线无 | 欧美日韩一区三区 | 69精品视频在线观看 | 不卡的一区二区三区 | 在线观看视频 | 成人h在线| 狠狠色噜噜狠狠 | 91精品综合在线观看 | 婷婷精品在线 | av在线之家电影网站 | 久久欧美综合 | 亚洲一区精品人人爽人人躁 | 国产精品一区二区电影 | 在线视频黄 | 午夜久久精品 | 国产成人一二片 | 日韩电影在线观看一区二区三区 | 91在线麻豆 | 国语黄色片 | 天堂av免费看| 99re6热在线精品视频 | 中文字幕网址 | 日韩精品三区四区 | 九九在线播放 | a在线观看国产 | 一区二区av | av免费在线观看网站 | 日本中文字幕系列 | 久久久久国产精品一区二区 | 午夜精品影院 | 91亚洲成人| 日韩xxxx视频 | 国产18精品乱码免费看 | av电影免费观看 | 91av亚洲 | 综合久久久久久久久 | 韩国一区二区三区视频 | 999色视频| 91精品国产综合久久福利不卡 | 中文视频一区二区 | 免费看的黄色片 | 成片视频免费观看 | 激情偷乱人伦小说视频在线观看 | 国产精品午夜久久 | 日韩精品中字 | 亚洲天堂精品 | 日韩av电影手机在线观看 | 奇米网在线观看 | 日韩免费大片 | 精品国产伦一区二区三区 | 中文字幕一区二区三区视频 | 久久艹在线 | 日韩高清www | 一区二区三区不卡在线 | 日韩午夜视频在线观看 | 亚洲精品乱码久久久久久9色 | 欧美黑人巨大xxxxx | 久久久久久久久久毛片 | 正在播放国产91 | 成片人卡1卡2卡3手机免费看 | 国产一级片免费观看 | 西西大胆啪啪 | 日韩中文字幕a | 久久久久国 | 日韩草比| 91香蕉视频色版 | 久热国产视频 | 亚洲高清视频在线观看免费 | 97国产情侣爱久久免费观看 | 亚洲综合视频在线播放 | 国产一区二区高清视频 | 一级免费看视频 | 国产精品九九久久久久久久 | 日韩免费不卡视频 | 免费精品人在线二线三线 | 韩国av一区二区三区 | 国产成人福利在线 | 欧美国产日韩一区二区三区 | 91精品电影 | 天天玩天天干 | 91精品视频免费观看 | 国产一区在线不卡 | 成人国产电影在线观看 | 国产精品久久久久999 | 国产日韩高清在线 | 97在线观看视频 | 欧美日韩一区二区三区在线观看视频 | www日韩在线观看 | 国产一区二区在线免费 | 精品黄色视 | 热久久国产精品 | 免费日韩 精品中文字幕视频在线 | 探花视频免费观看高清视频 | 开心丁香婷婷深爱五月 | 天天色天天综合网 | 久草在线官网 | 日韩精品在线观看视频 | 欧美精品一区二区在线观看 | 97碰碰视频 | 久草在线久草在线2 | 国产精品18久久久久白浆 | 一区二区欧美在线观看 | 久久精品电影 | 欧美视频不卡 | 精品国产成人av在线免 | 久久精品一二区 | 国产精品久久久久永久免费观看 | 免费看的毛片 | 狠狠黄 | 91av蜜桃| 欧美激情视频在线免费观看 | 日本99精品 | 国产一区自拍视频 | 国产艹b视频 | 狠狠干天天操 | 精品一区二区在线观看 | 国产91在线免费视频 | 欧美日韩高清在线观看 | 国产精品久久久久久久久久久久 | 一区精品久久 | 香蕉影院在线观看 | 久久69av| 国产精品永久 | av中文字幕剧情 | 久久久麻豆视频 | 国产精品久久久久av福利动漫 | 伊人婷婷在线 | 尤物一区二区三区 | 白丝av免费观看 | 亚洲精品美女视频 | 免费网站在线 | 91中文在线 | 四虎影视精品永久在线观看 | 成人网在线免费视频 | 精品国产乱码久久久久久天美 | 免费看成年人 | 中文字幕激情 | 国产精品视频在线看 | 中文字幕国产亚洲 | 日韩电影中文字幕在线 | 国产成人无码AⅤ片在线观 日韩av不卡在线 | 亚洲天堂精品视频在线观看 | av免费网站 | 在线国产精品视频 | 国产精品久久久久久久久久久久 | 欧美日韩精品久久久 | 久久一区二区三区国产精品 | 国产亚洲精品久久久网站好莱 | 国产精品精品国产色婷婷 | 国产亚洲精品日韩在线tv黄 | 91免费观看国产 | 日韩视频免费 | 欧美一级视频免费 | 狠狠干婷婷色 | 日日干激情五月 | 婷婷五情天综123 | 成年人国产精品 | 香蕉影视在线观看 | 婷婷在线综合 | 亚洲最新毛片 | 成人av电影在线观看 | 亚洲天堂自拍视频 | 精品久久一区二区 | 日精品在线观看 | 91传媒在线 | 看av免费网站| 99久久99久久精品免费 | 欧美一区二区三区激情视频 | 人人干在线 | 国产精品久久婷婷六月丁香 | 99热日本| www.在线观看av | 国产精品四虎 | 久久亚洲福利视频 | 婷婷色av | 国产欧美精品在线观看 | 日韩a免费 | 成人免费在线观看入口 | 99久久精品久久久久久动态片 | 国产精品视频免费在线观看 | 免费a级观看 | 六月丁香在线视频 | 成人毛片100免费观看 | 久久综合之合合综合久久 | 免费高清无人区完整版 | 久久久99精品免费观看乱色 | 韩国在线一区 | 亚洲一区精品二人人爽久久 | 最近中文字幕国语免费高清6 | 午夜在线观看一区 | 色天天综合久久久久综合片 | 亚洲精品午夜久久久久久久 | 国产中文字幕视频在线观看 | 免费国产一区二区视频 | 在线观看日韩精品 | 亚洲 欧洲 国产 日本 综合 | 久久久鲁| 激情综合网色播五月 | 国产精品手机在线观看 | 婷婷精品国产欧美精品亚洲人人爽 | 国产成人亚洲在线观看 | 婷婷丁香花五月天 | 国产福利一区二区三区视频 | 99精品黄色片免费大全 | 国产成人精品av在线观 | 91精品国产综合久久久久久久 | av电影不卡在线 | www.av小说| 国产精品久久二区 | 在线观看免费av网 | 国产69久久精品成人看 | 国产福利一区二区在线 | www.天天操 | 国产精品高清在线 | 亚洲欧洲在线视频 | 又粗又长又大又爽又黄少妇毛片 | 免费在线一区二区三区 | 波多野结衣一区二区三区中文字幕 | 久久一区二区三区超碰国产精品 | 超黄视频网站 | 中文字幕一二三区 | 久久免费国产精品1 | 成人综合免费 | 视频成人 | 91 在线视频| 中文字幕高清视频 | 婷婷午夜激情 | 日本中文字幕在线看 | 在线视频 影院 | 国产精品久久精品国产 | 国产精品视频在线观看 | 国产亚洲精品久 | 天天操偷偷干 | 成人国产精品一区二区 |