yp集之p6DP核心和細節

2021-10-14 15:08:15 字數 2058 閱讀 8974

區域性最優達到全域性最優,與分治最大區別在於分治分解的子問題沒有聯絡,可以說是dp是分治的子結構重複的優化,分治法做dp題花銷太大,沒有聯絡就分治

與貪心區別:貪心決策不可撤回式決策,每次區域性最優,當前決策不依賴以前決策也不將影響將來的決策,而dp,是利用與此決策步驟有關的以前dp好的子問題子分支選擇最好的,與此步驟的值共同構建此節點dp,可以說,貪心,不顧頭不顧尾巴,活在當下,而dp瞻前顧後,完美選擇。

73 8

8 1 0

2 7 4 4

4 5 2 6 5

#include

using

namespace std;

#define max 100

int d[max]

[max]

;int n;

intmaxsum

(int i,

int j)

intmain()

結果:30

重複計算:

記憶化:

在這裡插入**片#include

.h>

using

namespace std;

#define max 100

int d[max]

[max]

;int maxsum[max]

[max]

;int n;

intmaxsum

(int i,

int j)

intmain()

cout<<

maxsum(1

,1)<

system

("pause");

}

遞迴轉遞推:

#include

using

namespace std;

#define max 101

int d[max]

[max]

;int n;

int*maxsum;

intmain()

首先遞迴應該是我們解決動態規劃問題最常用的方法,帥,速度不算太慢

過程:1、將原問題分解為子問題

2、確定狀態

3、確定一些初始狀態(邊界條件)的值

4、確定狀態轉移方程

重複子問題:(超級容易發現的乙個)

我們要求x1xi,y1yj的lcs,那麼是不是要求x1xi-1,y1yi-1的lcs

我們要求x1xi-1,y1yi-1的lcs,那麼是不是要求x1xi-2,y1yi-2的lcs

所以我們要求的x1xi,y1yj的lcs這個大問題中,包含了很多的重複子問題

具體做法:

c【i】【j】表示x1xi,y1yj的lcs序列長度

x【i】==y【j】 c【i】【j】=c【i-1】【j-1】+1

x【i】!=y【j】 c【i】【j】=max(c【i-1】【j】,c【i】【j-1)

i0||j0 c【i】【j】=0

貼個**(求最優值和最優解)

#include

#define max_v 1005

using

namespace std;

char x[max_v]

,y[max_v]

;int dp[max_v]

[max_v]

;int l1,l2;

intdfs

(int i,

int j)

else

else

//來自左邊

}return0;

}int

main()

else}}

printf

("%d\n"

,dp[l1]

[l2]);

dfs(l1,l2)

; cout<

}return0;

}

P3500 2015多校聯訓6 獨立集 dp

題目大意 求一數列的最大上公升子串行 必定存在此最大上公升子串行的點 如果乙個點必定存在與最長上公升子串行中,那麼必須滿足兩個條件 1.該點存在於最長上公升子串行中。2.通過此點的最長上公升子串行長度唯一。但此題由於資料範圍為1000005,所以常規n方求最長上公升子串行的方法肯定不行,那麼就考慮用...

P1455 搭配購買(並查集 dp)

題目穿越門 題目描述 明天就是母親節了,電腦組的小朋友們在忙碌的課業之餘挖空心思想著該送什麼禮物來表達自己的心意呢?聽說在某個 上有賣雲朵的,小朋友們決定一同前往去看看這種神奇的商品,這個店裡有n朵雲,雲朵已經被老闆編號為1,2,3,n,並且每朵雲都有乙個價值,但是商店的老闆是個很奇怪的人,他會告訴...

P6047 絲之割 斜率優化,dp

然而絲之鴿還是沒有出 兩個平行的線,上面連線著若干條弦,第i ii條連線上方的x ix i xi 個下方的y iy i yi 然後每次可以選擇乙個位置 i,j i,j i,j 可以切斷任何位於位置 u,v u,v u,v 的弦僅當滿足條件 u i,v u i,v u i,v,消耗代價為ai bj a...