輪廓線動態規劃問題

2021-07-05 13:31:56 字數 1977 閱讀 9049

好久木有更新了,感覺都有點陌生了,上個月因為各種奇怪的事情都沒有好好刷過題,做過的題也沒好好總結,so,這個月再好好努力!

題目傳送:uva - 11270 - tiling dominoes

基礎的輪廓線動態規劃。

ac**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x7fffffff

using

namespace

std;

int n, m, cur;

ll dp[2][1

<< 11];//滾動陣列,第二維開到11就好了,不然tle。

void update(int a, int b)

int main() }}

printf("%lld\n", dp[cur][(1

<< m) - 1]);

}return

0;}

題目傳送:hdu - 4804 - campus design

13年南京賽區銀牌題。

輪廓線動態規劃或者插頭dp。

其實就是上一題的變形。

只不過編碼的時候要注意很多細節,對思維能力和程式設計能力都有提高。

ac**:

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

#define inf 0x7fffffff

using

namespace

std;

#define mod 1000000007

int n, m, c, d;

int cur;

char mp[105][25];

int dp[2][1

<< 11][22];//注意這裡應該開到22,不然會wa。

void update(int a, int b, int c, int d)

}int main()

memset(dp, 0, sizeof(dp));

int tot = (1

<< m) - 1;

cur = 0;

dp[0][tot][0] = 1;

for(int i = 0; i < n; i ++) }}

else }}

}}

int ans = 0;

for(int i = c; i <= d; i ++)

printf("%d\n", ans);

}return

0;}

輪廓線動態規劃

這類問題的共同特點是 在乙個比較 窄 的棋盤上進行複雜操作。如果採用傳統方法 以整行整列為狀態 進行動態規劃,將無法進行狀態轉移,因此只能把參差不齊的 輪廓線 作為狀態的一部分。儘管輪廓線的形態複雜,但由於棋盤比較窄,狀態總數仍然可以控制在可以接受的範圍內。直接看例題 1,鋪放骨牌 用1 2骨牌覆蓋...

大樓輪廓線

輸入第一行乙個數表示有n座大樓,後面依次輸入n行,每一行表示大樓的起始點,終點和高度,輸出為大樓輪廓資訊 如下圖 第一行輸出為3 後面有三行輸入表示大樓的資訊 第二行為 1 3 3 第三行為 2 4 4 第三行為 5 6 1 輸出大樓輪廓資訊 第一行 1 2 3 第二行 2 4 4 第三行 5 6 ...

hdu2167 輪廓線動態規劃

輸入比較難處理,周圍8格數字不可取。因為必須要記錄當前格左上角的數字有沒有取得情況,所以所以要在一般的輪廓線上加一位,並且換行時要更新一下狀態。如下圖 狀態記錄及轉移 在取11格的數字時,我們需要判斷10,6,7,8格是否有取數字。在更新11格的狀態的同時,丟棄掉第6格的狀態值。在遇到換行時,第8格...