DP動態規劃(持續更新)

2021-08-04 08:20:05 字數 4176 閱讀 9049

不用我說了吧

有乙個o(nlogn)的做法

smartoj1212

#include

using

namespace

std;

char a[30001],b[30001];

int dp[3001][3001];

int main()

printf("%d",dp[strlen(a+1)][strlen(b+1)]);

}

有乙個東西叫錯位排序

hdu2048 有點和排列組合相似

#include

int main()

; double b[21]=;//定義為double型就不需使用long long,同時輸出不需要轉換型別

for(i=3;i<=20;++i)

scanf("%d",&t);

while(t--)

return

0;}

不知道自己為什麼會錯,和正解輸出一樣qwq

我不會告訴你他是斐波那契數列..

最後一步時,可以豎著放乙個1*2的,也可以橫著放兩個1*2的,這樣

f[i]=f[i-1]+f[i-2]

自然數拆分

本題實質為正整數無序分拆,那麼設f[i,j]表示數i拆分為j部分的方案數,如果拆分出來的數有1,那麼1單獨分成一部分,那麼有f[i,j-1],無1,那麼將已拆分的每乙個數減1:f[i-j,j]。

綜上有:f[i,j]=f[i,j-1]+f[i-j,j],邊界:f[0,0]=0。 結果ans=∑f[n,i](2<=i<=n)

//**裡的i,j好像和題解裡反了。。qwq

#include

#include

#include

#include

#include

using

namespace

std;

unsigned

int n,dp[4005][4005],ans,mod = 2147483648;

int main()

}cout

0;}

有個東西叫單調棧

跟單調佇列不同的是單調佇列還有長度的限制,單調棧沒有 largest rectangle in a

histogram

其實就是乙個單調棧,每次把乙個矩形最左能到達的地方和最右能到達的地方找出來

最後max ans

#include

#include

using

namespace

std;

long

long n,a[100001],b[1000001]/*開始位置*/,c[1000001]/*結束位置*/,

d[1000001],stack[1000001]/*單調棧*/,tail,ans;

int main()

ans=0;tail=1;

for(int i=1;i<=n;i++)

stack[1]=a[1];

b[1]=1;d[1]=1;

for(int i=2;i<=n;i++)

else

b[i]=b[d[++tail]];

d[tail]=i;

stack[tail]=a[i];}}

for(int i=1;i<=n;i++)

else ans=max(ans,a[i]*(c[i]-b[i]+1));

}printf("%lld\n",ans);

}}

sliding window

我沒有做對,不知道為什麼wa。。。

單調佇列模板題

#include

#include

using

namespace

std;

int n,a[5000001],head,tail=1,stack[5000001],pos[5000001],k;

int main()

pos[1]=1;

stack[1]=a[1];

head=1;

for(int i=2;i<=n;i++)

else

while(a[i]=head);

stack[++tail]=a[i];

pos[tail]=i;

}if(i>=k)

printf("%d ",stack[head]);

}printf("\n");

for(int i=1;i<=n;i++)

head=0;tail=1;

stack[++head]=a[1];

pos[1]=1;

for(int i=2;i<=n;i++)

else

while(a[i]>stack[tail]&&tail>=head);

stack[++tail]=a[i];

pos[tail]=i;

}if(i>=k) printf("%d ",stack[head]);

}}

我的**非常好,只是它過不了。。

給你乙個01矩陣,求最大的全是1的正方形

//偷別人的**

#include #define max 500

intmatrix[max][max];

intmin(int a, int b)

int main()

printf("%d", max);

return

0;

}

設matrix[i][j]表示以(i,j)為右下角的最大正方形邊長

初始值1的矩陣matrix值為1

更新時matrix=min(matrix[i - 1][j], matrix[i][j - 1],matrix[i - 1][j - 1])

可以自己畫圖試一下,很好證明

hdu1003 最大區段和

#include

#include

#include

using

namespace

std;

int t,a[100001],n,sum,f,l,ff,ll,b;

int main()

else

if(b>sum)

}printf("case %d:\n",o);

printf("%d %d %d\n",sum,f,l);

if(o!=t) printf("\n");

}}

poj1050最大子矩陣

和上題一樣

//

//很水和hdu1003一樣

#include

#include

using

namespace

std;

int n,k,a[101][101],maxn,b;

int main()

maxn=a[1][1];

for(int i=1;i<=n;i++)

for(int j=i;j<=n;j++)

}printf("%d",maxn);

}

\ /

-->*<--

/o\/_\_\

/_/_0_\

/_o_\_\_\

/_/_/_/_/o\

/@\_\_\@\_\_\

/_/_/o/_/_/_/_\

/_\_\_\_\_\o\_\_\

/_/0/_/_/_0_/_/@/_\

/_\_\_\_\_\_\_\_\_\_\

/_/o/_/_/@/_/_/o/_/0/_\

[___]

。。。

動態規劃DP 持續更新

動態規劃 英語 dynamic programming,簡稱dp 是一種在數學 管理科學 電腦科學 經濟學和生物資訊學中使用的,通過把原問題分解為相對簡單的子問題的方式求解複雜問題的方法。動態規劃常常適用於有重疊子問題和最優子結構性質的問題,動態規劃方法所耗時間往往遠少於樸素解法。動態規劃背後的基本...

動態規劃入門 持續更新

本文通過01揹包問題引入動態規劃,來介紹各種揹包與初等動態規劃問題,持續更新中.問題概述 有n個重量和價值分別為 w i 和 v i 的物品。從這些物品中挑選出總重量不超過 w 的物品,求所有挑選方案中價值總和的最大值。下標從1開始 樣例 input n 4,w 10,w,v output 12 選...

動態規劃 dp

威威貓系列故事 打地鼠 威威貓最近不務正業,每天沉迷於遊戲 打地鼠 每當朋友們勸他別太著迷遊戲,應該好好工作的時候,他總是說,我是威威貓,貓打老鼠就是我的工作!無話可說.我們知道,打地鼠是一款經典小遊戲,規則很簡單 每隔乙個時間段就會從地下冒出乙隻或多隻地鼠,玩遊戲的人要做的就是打地鼠。假設 1 每...