精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

十五周算法訓練營——普通動態規劃(上)

開發 前端
斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。

今天是十五周算法訓練營的第十一周,主要講普通動態規劃(上)專題。

斐波那契數

斐波那契數 (通常用 F(n) 表示)形成的序列稱為 斐波那契數列 。該數列由 0 和 1 開始,后面的每一項數字都是前面兩項數字的和。也就是:

F(0) = 0,F(1) = 1 F(n) = F(n - 1) + F(n - 2),其中 n > 1 給定 n ,請計算 F(n) 。

示例 1:

輸入:n = 2 輸出:1 解釋:F(2) = F(1) + F(0) = 1 + 0 = 1

// 1. 暴力遞歸的方法
// 時間復雜度O(2^n)
function fib1(n) {
    if (n === 1 || n === 2) {
        return 1;
    }

    return fib1(n - 1) + fib1(n - 2);
}
const startTime1 = (new Date()).getTime();
console.log(fib1(30));
const endTime1 = (new Date()).getTime();
console.log(endTime1 - startTime1);

// 2. 帶備忘錄的遞歸解法(解決了重復計算的問題)
// 時間復雜度O(n)
function fib2(n) {
    // 利用Map存儲已經求過值的結果
    const map = new Map();

    const helper = n => {
        // 對于0和1的處理
        if (n === 1 || n === 2)  {
            return 1;
        }

        // 判斷是否已經計算過,計算過則返回該值
        if (map.has(n)) {
            return map.get(n);
        }

        // 進行遞歸求值
        map.set(n, helper(n - 1) + helper(n - 2));

        // 返回求得的值
        return map.get(n);
    }

    return helper(n);
}

const startTime2 = (new Date()).getTime();
console.log(fib1(30));
const endTime2 = (new Date()).getTime();
console.log(endTime2 - startTime2);

// 3. 動態規劃
// 在備忘錄啟發下,可以把備忘錄獨立出來成為一張表(DP table),在該表上完成自底向上的推算
function fib3(n) {
    const map = new Map();
    map
    .set(1, 1)
    .set(2, 1);

    for (let i = 3; i <= n; i++) {
        map.set(i, map.get(i - 1) + map.get(i - 2));
    }

    return map.get(n);
}

const startTime3 = (new Date()).getTime();
console.log(fib1(30));
const endTime3 = (new Date()).getTime();
console.log(endTime3 - startTime3);

// 4. 在動態規劃基礎上進行優化,由空間復雜度從O(n)優化到O(1)
function fib4(n) {
    if (n === 1 || n === 2) {
        return 1;
    }

    let prev = 1;
    let curr = 1;

    for (let i = 3; i <= n; i++) {
        const sum = prev + curr;
        prev = curr;
        curr = sum;
    }

    return curr;
}

const startTime4 = (new Date()).getTime();
console.log(fib1(30));
const endTime4 = (new Date()).getTime();
console.log(endTime4 - startTime4);

零錢兌換

給你一個整數數組 coins ,表示不同面額的硬幣;以及一個整數 amount ,表示總金額。

計算并返回可以湊成總金額所需的 最少的硬幣個數 。如果沒有任何一種硬幣組合能組成總金額,返回 -1 。

你可以認為每種硬幣的數量是無限的。

示例 1:

輸入:coins = [1, 2, 5], amount = 11 輸出:3 解釋:11 = 5 + 5 + 1

const coins = [1, 2, 5];
const amount = 19;

// 1. 暴力遞歸,可以找出狀態轉移方程
function coinChange1(coins, amount) {
    const dp = function (amount) {
        // 邊界條件:當目標金額為0時結果為0
        if (amount === 0) {
            return 0;
        }

        // 邊界條件:當目標金額為負數時輸出-1
        if (amount < 0) {
            return -1;
        }

        // 定義結果為正無窮
        let result = Infinity;

        // 進行循環遍歷
        for (let i = 0; i < coins.length; i++) {
            // 獲取子問題結果
            const subproblem = dp(amount - coins[i]);

            // 如果子問題小于0,則子問題無解,跳出本次循環
            if (subproblem < 0) {
                continue;
            }

            // 獲取較小的結果
            result = Math.min(result, 1 + subproblem);
        }

        return result === Infinity ? -1 : result;
    };

    return dp(amount);
}

const startTime1 = (new Date()).getTime();
console.log(coinChange1(coins, amount));
const endTime1 = (new Date()).getTime();
console.log(endTime1 - startTime1);

// 2. 帶備忘錄的遞歸
// 通過備忘錄消除子問題
function coinChange2(coins, amount) {
    const map = new Map();
    const dp = function (amount) {
        if (map.has(amount)) {
            return map.get(amount);
        }
        if (amount < 0) {
            return -1;
        }

        if (amount === 0) {
            return 0;
        }

        let result = Infinity;

        for (let i = 0; i < coins.length; i++) {
            const subproblem = dp(amount - coins[i]);

            if (subproblem < 0) {
                continue;
            }

            result = Math.min(result, 1 + subproblem);
        }

        map.set(amount, result === Infinity ? -1 : result);

        return map.get(amount);
    };

    return dp(amount);
}

const startTime2 = (new Date()).getTime();
console.log(coinChange2(coins, amount));
const endTime2 = (new Date()).getTime();
console.log(endTime2 - startTime2);

// dp數組的迭代解法
function coinChange3(coins, amount) {
    const map = new Map();
    // 設置邊界條件
    map.set(0, 0);

    // 每種情況初始化為amount+1,因為最大為amount,amount + 1就相當于正無窮
    for (let i = 1; i < amount + 1; i++) {
        map.set(i, amount + 1);
    }

    for (let i = 0; i < amount + 1; i++) {
        for (let j = 0; j < coins.length; j++) {
            if (i - coins[j] < 0) {
                continue;
            }
            map.set(i, Math.min(map.get(i), 1 + map.get(i - coins[j])));
        }
    }

    return map.get(amount) === amount + 1 ? -1 : map.get(amount);
}

const startTime3 = (new Date()).getTime();
console.log(coinChange3(coins, amount));
const endTime3 = (new Date()).getTime();
console.log(endTime3 - startTime3);

最小路徑和

給定一個包含非負整數的 m x n 網格 grid ,請找出一條從左上角到右下角的路徑,使得路徑上的數字總和為最小。

說明:每次只能向下或者向右移動一步。

示例 1:


圖片

輸入:grid = [[1,3,1],[1,5,1],[4,2,1]] 輸出:7 解釋:因為路徑 1→3→1→1→1 的總和最小。

// 該問題是最值問題,優先考慮動態規劃
// 動態規劃問題首先考慮是否具備最優子結構,只有具備最優子結構才能夠使用動態規劃
// 1. 狀態和選擇
// 本題的狀態是當前在第i行j列
// 選擇就是向下移動或向右移動達到該目標位置
// 2. dp數組含義
// dp[i][j]表示grid[i][j]的最小路徑和
// 3. 狀態轉移邏輯
// 為了得到dp[i][j]需要知道dp[i - 1][j]和dp[i][j - 1]哪個小,從而求得dp[i][j]
// 4. base case
// base case為i === 0 和 j === 0

function minPathSum(grid) {
    const m = grid.length;
    const n = grid[0].length;
    const dp = new Array(m);
    for (let i = 0; i < m; i++) {
        dp[i] = (new Array(n)).fill(0);
    }

    // base case
    dp[0][0] = grid[0][0];

    for (let i = 1; i < m; i++) {
        dp[i][0] = dp[i - 1][0] + grid[i][0];
    }

    for (let j = 1; j < n; j++) {
        dp[0][j] = dp[0][j - 1] + grid[0][j];
    }

    // 遍歷dp
    for (let i = 1; i < m; i++) {
        for (let j = 1; j < n; j++) {
            dp[i][j] = Math.min(dp[i - 1][j], dp[i][j - 1]) + grid[i][j];
        }
    }

    console.log(dp);

    return dp[m - 1][n - 1];
}

const grid = [
    [1,2,3]
    ,[4,5,6]
];
console.log(minPathSum(grid));

石子游戲

Alice 和 Bob 用幾堆石子在做游戲。一共有偶數堆石子,排成一行;每堆都有 正 整數顆石子,數目為 piles[i] 。

游戲以誰手中的石子最多來決出勝負。石子的 總數 是 奇數 ,所以沒有平局。

Alice 和 Bob 輪流進行,Alice 先開始 。 每回合,玩家從行的 開始 或 結束 處取走整堆石頭。 這種情況一直持續到沒有更多的石子堆為止,此時手中 石子最多 的玩家 獲勝 。

假設 Alice 和 Bob 都發揮出最佳水平,當 Alice 贏得比賽時返回 true ,當 Bob 贏得比賽時返回 false 。

示例 1:

輸入:piles = [5,3,4,5] 輸出:true 解釋: Alice 先開始,只能拿前 5 顆或后 5 顆石子 。 假設他取了前 5 顆,這一行就變成了 [3,4,5] 。 如果 Bob 拿走前 3 顆,那么剩下的是 [4,5],Alice 拿走后 5 顆贏得 10 分。 如果 Bob 拿走后 5 顆,那么剩下的是 [3,4],Alice 拿走后 4 顆贏得 9 分。 這表明,取前 5 顆石子對 Alice 來說是一個勝利的舉動,所以返回 true 。

  • 博弈問題都這么解決
// 該問題用動態規劃解決
// 動態規劃問題首先考慮是否具備最優子結構,只有具備最優子結構才能夠使用動態規劃
// 1. 狀態和選擇
// 狀態:石堆的左索引、右索引、當前輪到的人
// 選擇:選擇拿左邊還是右邊
// 2. dp數組含義
// dp[i][j]表示Alice和Blob的石子個數分別是多少
// 3. 狀態轉移方程
// 為了得到dp[i][j]需要知道dp[i + 1][j]和dp[i][j - 1],得到最優解 
// 4. base case
// base case就是i === j時
// 因為計算dp[i][j]時需要知道dp[i+1][j],所以需要倒著進行遍歷數組

// 注意:在這個過程中,先手做成選擇之后就變成了后手,后手在對方做完選擇后,就變成了先手。這種角色互換使得可以重用之前的結果,典型的動態規劃的標志

function stoneGame(piles) {
    const n = piles.length;
    // dp數組
    const dp = new Array(n);

    for (let i = 0; i < n; i++) {
        dp[i] = new Array(n);
    }

    // base case
    for (let i = 0; i < n; i++) {
        dp[i][i] = [piles[i], 0];
    }

    // 遍歷dp數組
    for (let i = n - 2; i >= 0; i--) {
        for (let j = i + 1; j < n; j++) {
            // 先手先選擇左邊或者右邊
            // 當先手進行選擇后,其在其子問題中就變成了后手
            const selectLeft = piles[i] + dp[i + 1][j][1];
            const selectRight = piles[j] + dp[i][j - 1][1];

            if (selectLeft > selectRight) {
                // 如果左側大于右側,則先手值就是左側值,后手值就是其子問題的先手值
                dp[i][j] = [selectLeft, dp[i + 1][j][0]];
            } else {
                dp[i][j] = [selectRight, dp[i][j - 1][0]];
            }
        }
    }

    // 結果存儲在dp[0][n - 1]中
    const resultArr = dp[0][n - 1];

    return resultArr[0] > resultArr[1];
}

const piles = [5, 3, 4, 5];
console.log(stoneGame(piles));

最大子數組問題

給你一個整數數組 nums ,請你找出一個具有最大和的連續子數組(子數組最少包含一個元素),返回其最大和。

子數組 是數組中的一個連續部分。

示例 1:

輸入:nums = [-2,1,-3,4,-1,2,1,-5,4] 輸出:6 解釋:連續子數組 [4,-1,2,1] 的和最大,為 6 。

// 既然是最值問題,肯定優先考慮動態規劃
// 首先判斷是否具備最優子結構,只有具備最優子結構,才能通過子問題的最值得到原問題的最值【該問題肯定具備最優子結構,因為若求nums[0……i],知道其最優子結構nums[0……i - 1】肯定可以求得
// 緊接著就要找正確的狀態轉移方程
// 1. 明確狀態:本題的狀態就是nums[0……i]的最大子數組和
// 2. 定義dp數組/函數:dp[i]表示nums[0……i]中以i位置結尾的最大子數組和
// 3. 明確選擇:為了獲取dp[i]的最大子數組和,需要指導dp[i - 1]的最大子數組和
// 4. 明確base case:此處的base case就是dp[0] = nums[0]
function maxSubArray(nums) {
    const dp = new Array(nums.length).fill(-Infinity);

    // base case
    dp[0] = nums[0];

    for (let i = 1; i < nums.length; i++) {
        dp[i] = dp[i - 1] > 0 ? dp[i - 1] + nums[i] : nums[i];
    }

    return Math.max(...dp);
}

//  注:其實此題還可以進行狀態壓縮,因為dp[i]只和dp[i - 1]相關
function maxSubArray1(nums) {
    let pre = nums[0];
    let maxVal = pre;

    for (let i = 1; i < nums.length; i++) {
        pre = Math.max(pre + nums[i], nums[i]);
        maxVal = Math.max(maxVal, pre);
    }

    return maxVal;
}

const nums = [-2,1,-3,4,-1,2,1,-5,4];
console.log(maxSubArray(nums));

編輯距離

給你兩個單詞 word1 和 word2, 請返回將 word1 轉換成 word2 所使用的最少操作數  。

你可以對一個單詞進行如下三種操作:

插入一個字符 刪除一個字符 替換一個字符

示例 1:

輸入:word1 = "horse", word2 = "ros" 輸出:3 解釋: horse -> rorse (將 'h' 替換為 'r') rorse -> rose (刪除 'r') rose -> ros (刪除 'e')

// 因為是最值問題,優先考慮動態規劃
// 解決兩個字符串的動態規劃問題,一般都是用兩個指針i、j分別指向兩個字符串的最后,然后一步步往前走,縮小問題的規模

// 方案一:暴力遞歸
function minDistance1(word1, word2) {
    const helper = (i, j) => {
        // 確定base case,該題目的base case就是當i走完s1或j走完s2,然后將對應剩下的長度返回
        if (i === -1) {
            return j + 1;
        }

        if (j === -1) {
            return i + 1;
        }

        if (word1[i] === word2[j]) {
            // 如果兩個字符一樣,則跳過
            return helper(--i, --j);
        } else {
            // 如果兩個字符不一樣,則在插入、刪除、替換中選擇最小的一個返回,然后加上該步驟操作
            return Math.min(helper(i, j - 1), helper(i - 1, j), helper(i - 1, j - 1)) + 1;
        }
    };

    return helper(word1.length - 1, word2.length - 1);
}

// 方案二:備忘錄
// 用遞歸暴力解決肯定會存在重疊子問題,所以需要解決重疊子問題
// 通過備忘錄解決子問題就是將[i, j]對應的值進行保存,然后運行的時候判斷有沒有
function minDistance2(word1, word2) {
   
}

// 方案三:動態規劃
// 因為是最值問題,優先考慮動態規劃
// 判斷是否具備最優子結構
// 找到正確的狀態轉移方程:
// 1. 明確狀態,本題中狀態就是在i位置的字符串到在j位置的字符串的編輯距離
// 2. 定義dp數組/函數的含義:本次dp為二維數組,表示s1[0……i]和s2[0……j]的最小編輯距離
// 3. 明確選擇:為了知道dp[i][j]的值,需要知道dp[i - 1][j - 1]、dp[i][j - 1]、dp[i - 1][j]的值,因為當前位置可以修改、插入、刪除操作
// 4. 明確base case:此處的base case就是i或j等于-1時候的值
function minDistance3(word1, word2) {
    // 因為當為-1的時候才是base case條件,但是數組中沒有這個索引,所以整體需要擴大1
    const dp = new Array(word1.length + 1);
    for (let i = 0; i < dp.length; i++) {
        dp[i] = (new Array(word2.length + 1)).fill(-1);
    }

    // 初始化base case
    for (let i = 0; i < dp.length; i++) {
        dp[i][0] = i;
    }

    for (let j = 0; j < dp[0].length; j++) {
        dp[0][j] = j;
    }

    // 進行dp數組的遍歷,在遍歷過程中需要注意:
    // 1. 遍歷過程中所需的狀態必須是已經計算出來的;
    // 2. 遍歷的終點必須是存儲結果的那個位置,此處是dp[word1.length][word2.length]
    for (let i = 1; i < dp.length; i++) {
        for (let j = 1; j < dp[i].length; j++) {
            // 因為整體移動了一個位置,所以比較的字符需要減一
            if (word1[i - 1] === word2[j - 1]) {
                dp[i][j] = dp[i - 1][j - 1];
            } else {
                dp[i][j] = Math.min(dp[i - 1][j - 1], dp[i][j - 1], dp[i - 1][j]) + 1;
            }
        }
    }

    // 最終編輯距離就是dp[word1.length][word2.length]
    return dp[word1.length][word2.length];
}

const word1 = 'horse';
const word2 = 'ros';
console.log(minDistance1(word1, word2));
console.log(minDistance3(word1, word2));
責任編輯:姜華 來源: 前端點線面
相關推薦

2023-06-19 07:31:34

普通動態規劃字符串

2023-06-05 07:30:51

2023-05-29 07:31:35

單調棧數組循環

2023-04-17 07:33:11

反轉鏈表移除鏈表

2023-05-22 07:31:32

Nums快慢指針

2023-04-03 07:33:05

數組排序快速排序法

2023-07-10 08:01:13

島嶼問題算法

2023-05-15 07:32:01

算法訓練滑動窗口

2023-07-03 08:01:54

2023-06-26 07:31:44

屬性物品背包

2021-09-23 10:53:43

數據中心

2016-08-05 20:21:51

CTO導師技術

2016-08-05 18:53:25

CTO導師技術

2021-07-08 20:22:05

AI

2013-04-22 12:58:14

TechExcel敏捷研發

2009-04-29 18:12:41

GAUPS培訓

2016-10-17 13:50:31

2013-07-13 22:38:14

微軟社區微軟MVPMWW

2015-01-04 14:54:28

IT訓練營

2016-08-04 13:41:27

CTO訓練營,技術管理
點贊
收藏

51CTO技術棧公眾號

日韩av片在线看| 国产伦一区二区三区色一情| 一本在线免费视频| 成人97精品毛片免费看| 亚洲二区视频在线| 青娱乐国产91| 精品人妻一区二区三区三区四区 | 精品国产免费久久| 国产成人无码一二三区视频| 动漫一区在线| 久久嫩草精品久久久精品一| 91久久精品美女| 可以在线观看av的网站| 久久人人88| 日韩高清欧美高清| 天美一区二区三区| 欧美日韩精品免费观看视完整| 亚洲欧美成人一区二区三区| 欧美午夜精品久久久久免费视 | 九色porny自拍视频在线播放 | 日日夜夜精品网站| 懂色av一区二区三区四区| 免费人成网站在线观看欧美高清| 韩国国内大量揄拍精品视频| 亚洲熟女毛茸茸| 在线视频亚洲专区| 亚洲精品在线一区二区| 91pony九色| yiren22亚洲综合| 日韩欧美中文在线| 精品无码国产一区二区三区av | 欧美激情视频一区二区| 国产精品综合激情| 国产探花在线精品| 日韩精品中文字幕在线播放| 黑人巨大猛交丰满少妇| 色综合视频一区二区三区44| 91久久国产最好的精华液| 欧美日韩在线一| 成人福利影视| 亚洲欧美日韩国产手机在线| 一区二区日本| av在线天堂| 国产视频911| 欧美lavv| 黄色小视频在线观看| av一区二区三区| 国产精品免费区二区三区观看| 国产毛片在线视频| 紧缚捆绑精品一区二区| 国产精品专区第二| 91成人一区二区三区| 奇米色一区二区三区四区| 国产成人精品在线视频| 天天爽夜夜爽人人爽| 午夜影院日韩| 国产91亚洲精品| 亚洲精品久久久久久久蜜桃| 日韩成人一区二区| 国产精品黄页免费高清在线观看| 黄色一级视频免费看| 久热国产精品| 国产精品久久久av久久久| 亚洲黄网在线观看| 蜜桃av一区二区| 91精品久久久久久久久久久久久久| 精品人妻一区二区三区潮喷在线| 日韩二区在线观看| 国产精品视频区| 国产精品乱码一区二区| 国产aⅴ综合色| 国内精品**久久毛片app| 亚洲免费黄色片| 91在线视频18| 欧美一区二视频在线免费观看| 国产精品久久一区二区三区不卡 | 欧美精品videos极品| 亚洲午夜伦理| 青草青草久热精品视频在线观看| 无码人妻丰满熟妇精品| 久久福利视频一区二区| 亚洲综合最新在线| 外国精品视频在线观看 | 日韩欧美一级片| bl动漫在线观看| 偷拍亚洲精品| 日韩中文字幕亚洲| 国产乱码久久久久久| 久久国产88| 成人免费午夜电影| 天天干天天爱天天操| 国产日产精品一区| 青青青青在线视频| av一区在线| 日韩一区二区电影在线| 在线观看国产三级| 久久精品国内一区二区三区水蜜桃| 欧美二区在线播放| 日本视频www色| 福利一区二区在线| 日韩啊v在线| 黄色的视频在线观看| 日本电影亚洲天堂一区| 一个人看的视频www| 免费久久久久久久久| 另类视频在线观看| 无码人妻丰满熟妇精品区| 国产精品乡下勾搭老头1| 久久国产手机看片| 高潮毛片在线观看| 在线观看视频91| 蜜臀av粉嫩av懂色av| 日韩欧美高清| 国产91在线播放九色快色| www.天天干.com| 亚洲国产精品v| 中文字幕无码精品亚洲35| 四虎影视国产精品| 亚洲人永久免费| 久久精品国产亚洲av香蕉| 久久精品国产精品青草| 鲁丝片一区二区三区| 在线黄色网页| 宅男在线国产精品| 欧美偷拍一区二区三区| 亚洲欧洲一区| 亚洲一区亚洲二区亚洲三区| 五月天婷婷在线视频| 日韩欧美国产一区二区| 这里只有精品在线观看视频 | 缅甸午夜性猛交xxxx| 免费欧美网站| www.xxxx精品| 亚洲天堂免费av| 久久久久国产精品麻豆ai换脸 | 精品一区中文字幕| 视频一区视频二区视频| av资源亚洲| 日韩成人中文电影| 91美女免费看| 99久久99精品久久久久久 | 模特精品在线| 久久精精品视频| 亚洲私拍视频| 日韩精品免费在线观看| 日本中文字幕免费| 成人三级在线视频| 拔插拔插海外华人免费| 丁香一区二区| 欧美成人精品一区二区| 99久久免费国产精精品| 亚洲视频免费观看| 在线视频一二区| 欧美一区二区三区久久精品茉莉花| 成人激情视频在线播放| 久草中文在线观看| 日韩欧美一级精品久久| 欧美日韩精品在线观看视频| 国产精品综合一区二区| 少妇久久久久久被弄到高潮| 亚洲精选av| 国内精品小视频| 天天干天天摸天天操| 黑人巨大精品欧美一区二区免费| 国产制服丝袜在线| 久久亚洲视频| 一本一道久久a久久综合精品 | 亚洲av成人无码久久精品| 日韩av一区二区三区四区| 亚洲蜜桃av| 日韩黄色av| 97人人做人人爱| 成年人在线免费观看| 91精品国产综合久久久蜜臀粉嫩| 国产精品成人免费观看| 成人精品视频一区| 成人毛片视频网站| 色婷婷综合网| 鬼打鬼之黄金道士1992林正英| 超碰在线99| 中文字幕精品网| www.成人精品| 日韩欧美中文第一页| 懂色av蜜臀av粉嫩av永久| 粉嫩av亚洲一区二区图片| 欧美日韩黄色一级片| 女厕嘘嘘一区二区在线播放| 91精品久久久久| a级大胆欧美人体大胆666| 亚洲毛片在线免费观看| 96亚洲精品久久久蜜桃| 午夜精品123| 国精产品久拍自产在线网站| 99精品视频在线播放观看| 欧美三级理论片| 亚洲精品国产日韩| 亚洲欧洲一区二区| 激情视频极品美女日韩| 国产欧美va欧美va香蕉在线| 97人人在线视频| 最近2019中文字幕一页二页| 刘亦菲毛片一区二区三区| 欧美少妇bbb| 国产又大又黄视频| 亚洲精品成人少妇| 日韩视频在线观看免费视频| 国产不卡视频一区| 亚洲综合欧美激情| 亚洲国产一区二区三区a毛片| 一区二区免费在线视频| 亚洲小说图片视频| 成人影片在线播放| 亚洲综合资源| 日本久久久久久久久| 自由的xxxx在线视频| 亚洲天堂av综合网| 香港三日本三级少妇66| 日韩一二三区不卡| 亚洲熟妇av乱码在线观看| 日韩人体视频一二区| 久久精品国产av一区二区三区| 综合久久给合久久狠狠狠97色| 玖玖爱在线观看| 99久久久久久| 中文字幕 欧美 日韩| 久久99精品久久久| 国产wwwxx| 久久精品综合| 免费成人午夜视频| 99精品福利视频| 天堂8在线天堂资源bt| 久久久久国产精品| 亚洲图片欧洲图片日韩av| 久久成人av| 欧美裸体网站| 亚洲人成伊人成综合图片| 国产一级二级三级精品| 国产一区二区三区不卡av| 91久久精品一区二区别| 在线视频成人| 国产欧美日韩丝袜精品一区| 懂色aⅴ精品一区二区三区| 国产成人精品久久| 第四色男人最爱上成人网| 国产91精品久久久久久| 看黄在线观看| 欧美资源在线观看| 周于希免费高清在线观看| 8x拔播拔播x8国产精品| 欧美aa在线| 欧美一区二区色| 精精国产xxxx视频在线播放| 2019亚洲日韩新视频| 国产亚洲成av人片在线观看 | 久久国产三级| 国产一区二中文字幕在线看| 日韩av黄色| 亚洲综合日韩在线| 9999久久久久| 久久国产精品免费一区| 欧美日韩高清| 日日噜噜噜夜夜爽爽| 中文字幕av亚洲精品一部二部| 中国女人做爰视频| 亚洲激情自拍| 99久久国产宗和精品1上映| 日本视频在线一区| 色综合五月婷婷| 成人福利视频网站| 国产黄片一区二区三区| 国产精品热久久久久夜色精品三区 | 亚洲av综合一区| 欧美日韩情趣电影| 精品国产乱码一区二区三 | 亚洲av无码一区二区三区网址| 91色在线porny| 日韩不卡av在线| 亚洲欧洲制服丝袜| 日本一级淫片免费放| 日本黄色一区二区| 国产黄色av片| 日韩电影中文字幕在线观看| av小片在线| 欧美激情综合亚洲一二区 | 亚洲一级特黄| 亚洲午夜无码av毛片久久| 麻豆国产一区二区| 欧美双性人妖o0| 国产精品午夜久久| 国产污视频在线观看| 色婷婷av一区二区| 99精品在线视频观看| 日韩av综合网站| www久久日com| 国产成人精品一区| 综合中文字幕| 一区二区视频在线免费| 海角社区69精品视频| 久久久精品三级| 国产资源在线一区| 欧美色图亚洲激情| 亚洲精品国产视频| 这里只有精品国产| 亚洲国产日韩欧美综合久久| 淫片在线观看| 青草热久免费精品视频| 激情五月综合婷婷| 欧美中日韩一区二区三区| 激情婷婷亚洲| 伊人网在线综合| 久久蜜臀中文字幕| 久久精品视频9| 7799精品视频| 国产日本在线观看| 97视频在线观看视频免费视频| 国产专区精品| 在线天堂一区av电影| 噜噜噜91成人网| 91精品人妻一区二区三区四区| 国产精品美女久久久久aⅴ| 中文字幕免费在线观看视频| 欧美精品一区二区三区蜜桃视频| 求av网址在线观看| 国产精品久久久久77777| 亚洲欧洲美洲国产香蕉| 极品美女扒开粉嫩小泬| 国产精品亚洲第一区在线暖暖韩国| 99久久久无码国产精品衣服| 黄色成人av在线| www.黄色av| 欧美精品在线免费播放| 亚洲黑人在线| 亚洲一区免费看| 美女精品自拍一二三四| 中文字幕欧美激情极品| 欧美最新大片在线看| av在线收看| 国产美女精彩久久| 久久精品高清| 亚洲欧美日韩精品一区| 日韩一区日韩二区| 91女人18毛片水多国产| 中文字幕欧美专区| 日本国产亚洲| 中文字幕在线亚洲三区| 精品亚洲国内自在自线福利| 久久国产高清视频| 欧美一级免费大片| 秋霞在线午夜| 国产精品日韩一区二区| 在线视频免费在线观看一区二区| 波多野结衣影院| 欧美视频在线视频| 青青草手机在线| 日韩av片永久免费网站| 精品国产1区| 亚洲欧美视频二区| 亚洲日本在线天堂| www.xxxx国产| 91tv亚洲精品香蕉国产一区7ujn| 亚洲精品国产动漫| 日本新janpanese乱熟| 国产精品美女久久福利网站| 国产绿帽一区二区三区| 欧美精品电影在线| 人体久久天天| 中文字幕在线导航| 综合在线观看色| 四虎永久在线精品免费网址| 136fldh精品导航福利| 精品国产欧美日韩| 激情文学亚洲色图| 亚洲成人动漫精品| 国产中文在线| 91精品视频免费| 亚洲精品偷拍| 免费视频91蜜桃| 91精品国产丝袜白色高跟鞋| 蜜桃视频在线观看免费视频| 神马一区二区影院| 国产成人免费视频网站| 中文字幕在线观看视频网站| 在线午夜精品自拍| 91精品导航| 国产一级片黄色| 一区二区三区四区激情| 久久米奇亚洲| 99国产精品久久久久老师| 老司机久久99久久精品播放免费| 福利视频第一页| 日韩av中文字幕在线播放| 久久精品国产精品亚洲毛片| www.日本在线视频| 中文字幕欧美日本乱码一线二线| 亚洲第一页视频| 国产精品久久久久久一区二区| 好看的亚洲午夜视频在线| 国产三级短视频| 日韩电影大全免费观看2023年上| 日日夜夜亚洲|