• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            Climber.pI的OI之路

            Through the darkest dark,may we see the light.

            Dp札記

            記錄寫過的dp題目,并分類,嘗試總結(jié)出某類題目的一般模型.

            (題目前打*的未編程驗(yàn)證)

            【線性模型】

            Tyvj 1049 最長(zhǎng)不下降子序列問題 [O(n^2) [還存在基于二分查找的O(nlogn)算法]]

            • [狀態(tài)] f[i]表示從1到i的最長(zhǎng)不下降子序列. 最大值需更新.
            • [方程] if(a[j]<=a[i]) f[i] = max{f[j]} (0<j<i, 1<i<=n)

            NOIp 2004 合唱隊(duì)形 [O(n^2), 雙向最長(zhǎng)上升子序列]

            • [方程] f[i] = max{f[j]}+1 , 枚舉k(0<=k<=n).

            Rqnoj 164 最長(zhǎng)公共子串 [記錄方案 子串連續(xù) O(n^2)]

            • [狀態(tài)] f[i][j]表示 子串A第i個(gè)字符 和 子串B第j個(gè)字符 前 公共子序列長(zhǎng)度
            • [方程] f[i][j] = f[i-1][j-1]+1(a[i]=b[j],a[i-1]=b[j-1])|max{f[i-1][j],f[i][j-1]}

            UVa 111/10405  [最長(zhǎng)公共子序列問題,O(n^2). 可以使用滾動(dòng)數(shù)組降至O(n).]

            • [狀態(tài)] f[i][j]表示 子串A第i個(gè)字符 和 子串B第j個(gè)字符 前 公共子序列長(zhǎng)度
            • [方程] f[i][j] = f[i-1][j-1]+1(a[i]=b[j])|max{f[i-1][j],f[i][j-1]}

            UVa 507 [最大連續(xù)和,O(n).]

            • [狀態(tài)] f[i]表示當(dāng)前子序列和(非負(fù))
            • [方程] f[i]=max{f[i-1]+a[i], a[i]},遞推過程中需更新最大值.

            【矩陣模型】

            *UVa 10285 滑雪 [記憶化搜索,最長(zhǎng)下降子序列二維版本]

            • [狀態(tài)] f[i][j]表示從(i,j)開始的最長(zhǎng)下降子序列長(zhǎng)度.
            • [方程] f[i][j] = max{f[i-1][j], f[i][j-1], f[i+1][j], f[i][j+1]}+1(f[i][j]>f[i-1][j]..)

            UVa 108

            • 最大矩陣和,O(n^3),方程不會(huì). 最大連續(xù)和的二維版本.

            NOIp 2000 方格取數(shù) O(n^4)

            • [狀態(tài)] f[i][j][k][l]表示兩人分別到(i,j)、(k,l)所取過的數(shù)的和.G[i][j]表示方格里的數(shù).
            • [方程] f[i][j][k][l] = max{f[i-1][j][k-1][l], f[i-1][j][k][l-1], f[i][j-1][k-1][l], f[i][j-1][k][l-1]}+G[i][j]+(i==k&&j==l ? 0 : G[k][l])

            NOIp 2008 傳紙條

            (1) O(n^4)

            • [狀態(tài)] f[x1][y1][x2][y2] 表示從出發(fā)點(diǎn)分別到(x1,y1)、(x2,y2)取的最大值.G[x][y]表示該格的數(shù).
            • [方程] f[x1][y1][x2][y2] = max{f[x1-1][y1][x2-1][y2],f[x1-1][y1][x2][y2-1],f[x1][y1-1][x2-1][y2],f[x1][y1-1][x2][y2-1]}+G[x1][y1]+G[x2][y2](如果位置不重復(fù))
            • [一個(gè)重要優(yōu)化] 顯然有y2=x1+y1-x2(y2>0),因而時(shí)間復(fù)雜度可以降到O(n^3).Cena顯示總用時(shí)從近4s降到近0.3s,效果明顯.

            *(2) O(n^3)

            • [狀態(tài)] f[p][x1][x2],p表示經(jīng)過的格子數(shù).
            • [方程] f[p][x1][x2]=max{f[p-1][x1-1][x2-1],f[p-1][x1-1][x2],f[p-1][x1][x2-1],f[p-1][x1][x2]}+G[x1][p-x1]+G[x2][p-x2](如果位置不重復(fù))

            USACO 5.3.4/3.3.4 [矩陣dp,O(n^2)]

            • [狀態(tài)] f[i][j]表示以(i,j)為右下角的正方形最大邊長(zhǎng)
            • [方程] f[i][j] = min{f[i-1][j], f[i-1][j-1], f[i][j-1]}+1 (0<=i,j<n)
            • [預(yù)處理] 若G[i][j]=1則f[i][j]=1.

            【背包問題】

            USACO 3.3.2

            • [狀態(tài)] f[a1][a2][a3][a4][a5]為買a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5時(shí),所需的最少價(jià)格
            • [方程] f[a1][a2][a3][a4][a5] = min{f[a1-p[i][1][a2-p[i][2][a3-p[i][3][a4-p[i][4]][a5-p[i][5]+p[i][0]} (0<i<=s, ak-p[i][k]>=0,p[i][0]是優(yōu)惠后的價(jià)格)
            • [邊界條件] f[0][0][0][0][0]=0;
            • USACO官方解法很有啟發(fā)性,用最短路,把每種狀態(tài)[a1][a2][a3][a4][a5](a1件物品1,a2件物品2,a3件物品3,a4件物品4,a5件物品5)看成一個(gè)點(diǎn),則至多7776個(gè)點(diǎn),而每個(gè)優(yōu)惠就是一條邊,則至多105條邊。 接下來就是求[0,0,0,0,0]到目標(biāo)狀態(tài)的最短路,用Dijkstra(Heap優(yōu)化)即可.

            USACO 3.1.2 [完全背包問題, O(n)或O(n^2).]

            • [狀態(tài)] f[i][j]表示放入第i個(gè)物體后剩余體積為j
            • [方程] f[i][j] = f[i-1][j] + f[i][j-c[i]]+w[i]

            USACO 3.1.6 [完全背包問題,O(n).]

            • [狀態(tài)] f[i]表示湊成i分郵資的最少郵票數(shù).
            • [方程] f[i] = min{f[i-v[j]]+1} (i-v[j] >= 0, 0<=i<n, f[0] = 0).

            USACO 2.3.4

            • [狀態(tài)] f[i,j]表示前i種貨幣構(gòu)成j的方法數(shù),用c[i]記錄貨幣的面值.
            • [方程] f[i,j]=f[i-1,j]; 不用第i種貨幣
                           f[i,j]=f[i-1,j]+f[i,j-c[i]] 用第i種貨幣,j>=c[i]

            【樹形】

            USACO 2.3.2

            • [狀態(tài)] f[i,j]表示用i個(gè)點(diǎn)組成深度最多為j的二叉樹的方法數(shù),則:
            • [方程] f[i,j]=∑(f[k,j-1]×f[i-1-k,j-1])(k∈{1..i-2}) 
            • [邊界] f[1,i]=1
            • 我們要求的是深度恰好為K的方法數(shù)S,易知S=f[n,k]-f[n,k-1]。但需要注意的是,如果每次都取模,最后可能會(huì)有f[n,k]<f[n,k-1],所以可以用S=(f[n,k]-f[n,k-1]+v) mod v

             

            【其他類型】

            USACO 1.5.1 [數(shù)字三角形]

            • [狀態(tài)] f[i][j]表示從(i,j)開始經(jīng)過的數(shù)字的最大和
            • [方程] f[i][j] = max{f[i+1][j], f[i+1][j+1]}+a[i][j]

            USACO 3.3.5 [博弈問題]

            • [狀態(tài)] s[i][j]表示從i加到j(luò)的和, 枚舉l=j-i. f[i][j]表示從i到j(luò)先取者能得到的最大數(shù)字和.
            • [方程] f[i][j] = s[i][j] - min{f[i+1][j], f[i][j-1]}

            USACO 3.2.2

            • [狀態(tài)] f[n][m]表示至多m個(gè)1的n位二進(jìn)制數(shù)數(shù)量
            • [方程] f[n][m] = f[n-1][m] + f[n-1][m-1] (f[0][m] = 1)

            posted on 2010-10-03 12:23 Climber.pI 閱讀(469) 評(píng)論(1)  編輯 收藏 引用 所屬分類: 動(dòng)態(tài)規(guī)劃

            Feedback

            # re: Dp札記[未登錄] 2011-05-18 19:14 Climber.pI

            我發(fā)現(xiàn)我只有上面類型的dp我會(huì)做...看而不寫基本全忘  回復(fù)  更多評(píng)論   

            国内精品伊人久久久久网站| 久久精品桃花综合| 久久亚洲高清观看| 99久久99久久精品国产| 久久亚洲AV无码西西人体| 久久精品国产免费观看| 久久99热精品| 亚洲中文字幕无码久久综合网| 狠狠色丁香久久综合婷婷| 一本色综合久久| 久久综合久久综合九色| 欧美日韩精品久久久免费观看| 成人妇女免费播放久久久| 欧美一区二区久久精品| 久久99精品国产99久久6男男| 97视频久久久| 久久久WWW成人免费精品| 久久99国内精品自在现线| 久久久久亚洲AV无码观看| 久久免费视频网站| 精品国产乱码久久久久久1区2区| 久久亚洲国产最新网站| 久久亚洲高清综合| 国产午夜福利精品久久| 久久亚洲AV成人无码电影| 偷偷做久久久久网站| 午夜视频久久久久一区 | 狠狠综合久久综合中文88| 日产精品99久久久久久| 国产成人综合久久精品红| 亚洲国产精品无码久久久久久曰| 亚洲国产精品无码久久一区二区| 麻豆精品久久久久久久99蜜桃| 精品国产一区二区三区久久久狼 | 影音先锋女人AV鲁色资源网久久 | 久久香蕉国产线看观看猫咪?v| 18禁黄久久久AAA片| 国产福利电影一区二区三区,免费久久久久久久精 | 久久这里都是精品| 久久国产精品99精品国产987| 日韩十八禁一区二区久久|