給你兩個序列a和b,求出他們的最長公共上公升子串行並輸出方案
動態規劃,我們假設f[i][j]表示a處理到第i位,b處理到第j位時的長度
那麼顯然,若a[i]=b[j],那麼f[i][j]=max+1,否則f[i][j]=f[i-1][j]
我們再記乙個g[i][j]表示f[i][j]是從**轉移過來的,記上面那個k即可
到時候直接倒序遞迴按照g[i][j]輸出,若g[i][j]=0那麼就--i
#pragma gcc optimize("o3")
#pragma g++ optimize("o3")
#include
#include
#include
using
namespace
std;
int f[5010][5010],g[5010][5010],a[5010],b[5010],n,m;
void print(int i,int j)
}int main()
if(a[i]>b[j]&&f[i-1][k]1][j]) k=j;
} }int j=0;
for(int i=m;i;--i)
if(f[n][i]>f[n][j]) j=i;
printf("%d\n",f[n][j]);
print(n,j);
}
Jzoj5424 鳳凰院兇真
給你兩個序列a和b,求出他們的最長公共上公升子串行並輸出方案 動態規劃,我們假設f i j 表示a處理到第i位,b處理到第j位時的長度 那麼顯然,若a i b j 那麼f i j max 1,否則f i j f i 1 j 我們再記乙個g i j 表示f i j 是從 轉移過來的,記上面那個k即可 ...
BZOJ 5424 燒橋計畫 單調佇列
題目鏈結 先考慮最暴力的 dp 設 f k i 表示搞掉第 1 sim i 段,燒了 k 段的最小花費,設 calc x,y sum x sim y le m?0 sum x sim y 可以列出轉移方程如下 f k i min f k 1 j calc j 1,i k a i j 這樣時間複雜度是...
JZOJ 交換 模擬
給出字串s和字串t,現在你要把s的某乙個字元和t的某乙個字元交換,使得交換之後的s至少要有三個連續相同的字元,交換之後的t也要有三個連續相同的字元。問有多少種不同的交換方式。第一行,乙個字串s。s只含有 r g b 三種字元,長度不超過50,不小於3。而且s任意兩個相鄰的字元都不相同。第二行,乙個字...