不用我說了吧有乙個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 每...