線性動態規劃的歸納總結

2021-10-10 10:51:30 字數 3445 閱讀 8621

lcs問題

矩陣路徑問題(只能往右或往下)

其他線性dp

歸納模式二(相鄰選點)

歸納模式三(物品分配)

歸納模式四(線段覆蓋)

雜項歸納模式六

方法1,o(n2):暴力

int

main()

ans=

max(ans,f[i]);

} cout<}

方法2,o(nlogn):二分查詢

void

run(

int n)

} cout<}

int

main()

}for

(int i=n;i>=

1;i--)}

int ans=0;

for(

int i=

1;i<=n;i++

)ans=

max(ans,f[i]

+g[i]-1

);}

例題鏈結

int

main()

}}}long

long res=0;

for(

int i=

1; i<=n; i++

)ans[f[i]

]+=g[i]

;for

(int i=n; i>=

1; i--)}

}

#

include

using

namespace std;

const

int n=

5e4+

100;

long

long f1[n]

,f2[n]

,g1[n]

,g2[n]

,lcs=

-1e9

,a[n]

,b[n]

;int

main()

}if(lcs)lcs=f1[i];}

}for

(int i=n; i>=

1; i--)}

}}long

long sum=0;

for(

int i=

1; i<=n; i++

)for

(int i=

1; i<=n; i++

)return0;

}

code

int

main()

} cout<[m];

}

優化

例題1,書本整理

#

include

using

namespace std;

struct

ppp a[

1000];

intcmp

(ppp x,ppp y)

int n,t,f[

105]

[105];

void

init()

}for

(int i=

1; i<=n; i++

)f[i][1

]=0;

//只有一本書,自然以它結尾的sum=0

}int

main()

}}int ans=

1e9;

for(

int i=

1;i<=n;i++

)ans=

min(ans,f[i]

[t])

;//整理好的書的結尾可能是1,n的任意一本

cout

}

例題鏈結

#

include

#include

using

namespace std;

long

long f[

205]

[205

],a[

205]

,b[205

],v[

205]

[205];

intmain()

}for

(int j=

1;j<=m;j++

)f[0

][j]

=1e9

;for

(int i=

1;i<=n;i++)}

} cout<[m];

return0;

}

經典的線段覆蓋問題:一維座標系中,已知n個線段的左右端點座標

問題1:求不重合下的最長覆蓋

設f[i]一維座標上從 0~i,線段的最長不重合覆蓋

vector儲存以線段右端點為下標的左端點座標

則有f[i]=max(f[vec[i][j]]+i-vec[i][j]),且f[i]由f[i-1]繼承

例題

#

include

#include

#include

using

namespace std;

vector<

int>vec[

30005];

int f[

30005];

intmain()

for(

int i=

0;i<=

30000

;i++)}

cout<30000];

return0;

}

例題鏈結

int c[

205]

[205

],f[

205]

[205][

1005

],x[

1005];

intmain()

}for

(int p=

1; p<=n; p++

)cin>>x[p]

;for

(int i=

1;i<=l;i++

) f[1]

[2][

0]=0

; x[0]

=3;for

(int p=

1; p<=n; p++)}

}int ans=

1e9;

for(

int i=

1; i<=l; i++)}

cout<}return0;

}

例題1

例題2

動態規劃用法歸納

在實際應用中,展示動態規劃的用法。01揹包問題 include includeusing namespace std int val 5000 int wei 5000 int f 13000 inline int max int a,int b int main cout 大意 一共有n個管道,每...

線性動態規劃

準確來說,動態規劃是一種思想,而不是一種演算法。算導裡將它歸結為 高階程式設計技巧。線性dp最常見的有 子集和問題,lis問題,lcs問題。拓展之後有 子段和問題,雜類問題。子集和問題的乙個例項 s,t 其中,s 是乙個正整數的集合,c是乙個正整數。子集和問題判定是否存在s的乙個子集s1,使得s1中...

線性動態規劃

方格取數 題目 提交記錄 討論題解設有 n n 的方格圖,我們在其中的某些方格中填入正整數,而其它的方格中則放入數字0。如下圖所示 2.gif 某人從圖中的左上角 a 出發,可以向下行走,也可以向右行走,直到到達右下角的 b 點。在走過的路上,他可以取走方格中的數 取走後的方格中將變為數字0 此人從...