總結一模擬較特別dp模型

2021-07-25 00:04:38 字數 2010 閱讀 1247

hdu1421 poj2228hdu2577 這三個題目是最近做到的比較有特點的一類 由於某一些條件 比如取了乙個東西 相鄰的東西就會有所改變 那麼一般會在樸素的轉移方程上再加一維狀態 0 1 代表對這一項不操作或者操作然後再從這個狀態的意義出發推方程 會相對好做一些 

hdu1421 搬寢室 經典dp模型 分析一下可以轉化為 n個有序數字 取k個相鄰的兩個數字  代價是這兩個數字的差的平方

一開始想了很久 感覺還有點像區間dp 後來仔細一想不管複雜度還是狀態都是不好做 經過大神指點 dp[i][j]代表前i個數字取j個相鄰的兩個數字 然後加一維[0][1]分別代表取與不取 然後推出方程 

dp[i][j][0] = min( dp[i-1][  j ][ 0 ] ,dp[ i - 1 ][ j ][1] )

dp[i][j][1] = dp[i-1][j-1][0] + (num[i] - num[i-1]) * (num[ i ] - num[i - 1])

然後再仔細一看發現[1]這個狀態是固定的可以遞推出來的 帶進去可以把dp[ i ][ j ][ 1 ]消去,

**如下(**裡面我沒有把狀態[ 1 ]都消去)

#include#include#include#include#include#include#include#include#include#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

const int mod=1e9+7;

const double pi=acos(-1.0);

#define clri(x) memset(x,-1,sizeof(x))

#define clr0(x) memset(x,0,sizeof x)

#define clr1(x) memset(x,inf,sizeof x)

#define clr2(x) memset(x,-inf,sizeof x)

#define writeln(x) cout<>x

#define long long long

#define rep(a,b,c) for(long a=b;a<=c;a++ )

#define rrep(a,b,c) for(long a=b;a>=c;a--)

#define eps 1e-10

int dp[2010][1005][2]; //0代表以i結尾的東西要搬 1代表不搬

int num[2200];

int minx[2200];

int main()

printf("%d\n",min(dp[n][k][0],dp[n][k][1]));

}}

poj2228  講的是一頭母牛睡覺的故事 總的來說 給n個數字  取m個數字 但是如果是某一連續段中第乙個取的話 這個數字的值是不加到總的res裡面的 比如1 2  3 4 5 6 我們選4 5  6 ,4是不加進去的 如果單獨選6 ,6也是不加進去的 還有比較麻煩的是環形情況  這個地方跟上面一樣 加一維,可以推出方程

dp[i][j][0]=max(dp[i-1][j][1] , dp[i-1][j][0]);

dp[i][j][1]=max(dp[i-1][j-1][1]+uti[i] , dp[i-1][j-1][0]);

dp[i][j][0,1]代表前i個數字取了j個數字且第j個數字不取或者取的最優解  由於環形情況**混亂 就不貼**了 

hdu2577 比較簡單的dp 列印一些大寫或者小寫字母 可以用capslock 也可以用shift 問怎麼樣使得打字次數最少

同樣的dp[i][0,1]代表前i個按lock或者shift的最優解 

然後進行方程轉移

if(str[i-1]>='a'&&str[i-1]<='z')

else

感覺做了有一些dp 但是還不夠敏感 應該繼續加強訓練

區間DP總結(一)

noip2000提高 乘積最大 需要用到高精度,目前還不會。noip2006提高組 能量項鍊 noi1995 石子合併 經典區間dp poj1141 brackets sequence 括號匹配 值得細看的部落格 動態規劃之區間dp專題 1 石子合併題目 區間dp模板。include define ...

棋盤式狀壓DP模型總結

狀壓dp分兩大類,一類是集合式,另一類就是棋盤式 即基於連通性 其中,集合式狀壓dp難度相較後者略大,形式複雜多變。而棋盤式狀壓dp的題目樣式都相差不多,解法也都殊途同歸,因此將這一類題進行總結,不難歸結出一套解題模板。我們先看以下三個例題。題目鏈結 狀態表示 f i,j,s 表示已經在前i行放了j...

學習動態規劃DP(一) DAG模型

之前初學了一點關於動態規劃的知識,但沒有系統的學習,最近在空閒時間根據紫書 演算法競賽入門經典 開始了比較有計畫的學習,先寫下這篇部落格,作為筆記。一 我對動態規劃的看法。動態規劃,即是把原問題劃分為各個規模更小的問題去解決,原問題的最優解包括了各個子問題的最優解 感覺本質上是分治法 所以動態規劃用...