1. 程式人生 > 其它 >3.31小模擬(lcs最長公共子序列

3.31小模擬(lcs最長公共子序列

T2

樹上小揹包,記錄一下,貌似和重心沒太大關係吧?

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<vector>
#include<string>
using namespace std;
const int N = 105;
int val[N];
vector<int
>g[N]; int dp[N],dep[N],siz[N],n,f[N]; void dfs1(int u,int fa){ dep[u] = dep[fa] + 1; for(int v : g[u]){ if(v == fa)continue; dfs1(v,u); f[u] += f[v]; } } int ans = 1e9; void dfs2(int u,int fa){ for(int v : g[u]){ if(v == fa)continue; dp[v]
= dp[u] + f[1] - f[v] * 2;// 右邊的減少f[v] 左邊的增加f[1]-f[v] ans = min(ans,dp[v]); dfs2(v,u); } } int main(){ #ifdef hahaha freopen("hospital.in","r",stdin); freopen("hospital.out","w",stdout); #endif scanf("%d",&n); for(int i=1;i<=n;++i){ int l,r; scanf(
"%d%d%d",&val[i],&l,&r); f[i] = val[i]; if(l)g[i].push_back(l),g[l].push_back(i); if(r)g[i].push_back(r),g[r].push_back(i); } dfs1(1,0); for(int i=1;i<=n;++i)dp[1] += (dep[i]-1) * val[i]; ans = dp[1]; dfs2(1,0); printf("%d",ans); }

T3求最長公共子序列

dp[i][j] :一個串到 i 另一個到 j 最長子序列長度,轉移看下面吧,在這裡把板子留了,以防我忘掉(

#include<cstdio>
#include<queue>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cctype>
#include<vector>
#include<string>
#define hahaha
using namespace std;
int dp[205][205];
int main(){
    #ifdef hahaha
    freopen("lcs.in","r",stdin);
    freopen("lcs.out","w",stdout);
    #endif
    char s1[205],s2[205];
    scanf("%s%s",s1+1,s2+1);
    int n = strlen(s1+1),m = strlen(s2+1);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j) {
            dp[i][j] = max(dp[i-1][j],dp[i][j-1]);
            dp[i][j] = max(dp[i][j],dp[i-1][j-1] + (s1[i] == s2[j]));    
        }
    printf("%d",dp[n][m]);
}