复杂度 o(nW)
n为物品种类,W是背包的重量
单副本背包问题:
K ( w , j ) = m a x { K ( w − w j , j − 1 ) + v j , K ( w , j − 1 ) } K(w,j)=max\{K(w-w_j,j-1)+v_j,K(w,j-1)\} K(w,j)=max{K(w−wj,j−1)+vj,K(w,j−1)}
K(w,j)代表背包重量为W,有j件物品时候的最大价值
多副本背包问题:
K ( w ) = m a x { K ( w − w i ) + v i : w i < = w } K(w)=max\{K(w-w_i)+v_i:w_i<=w\} K(w)=max{K(w−wi)+vi:wi<=w}
博客入口
设有s[m],和t[n]两个字符串,要找他们最长的公共子串
设置一个变量 long=0;
c(i,j)=s[i]==s[j]?c(i-1,j-1)+1:0
每次如果c(i,j)>long那么long=c(i,j)
设两个子序列的长度分别为m,n
那么时间复杂度就为O(mn)
给定一个数组如{ -2,11,-4,13,-5,-2 }
最大和为 i=2,j=4的时候 11-4+13=20
算法:
int sum=0, b=0;
for(int i=1;i<=n;++i){
if(b>0){
b+=a[i];
}
else{
b=a[i]
}
if(b>sum)
sum=b;
}
return sum;
O(n)