題目鏈接:[BOI2003]Gem 氣墊車
顯然總顏色數不會太多,隨便設置個上線暴力dp即可。
轉移的時候可以前綴和優化一下。
AC代碼:
#pragma GCC optimize("-Ofast","-funroll-all-loops")
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=1e4+10;
int n,dp[N][20],mi[20],res=1e9;
vector<int> g[N];
inline void add(int a,int b){g[a].push_back(b),g[b].push_back(a);}
void dfs(int x,int fa){
for(int i=1;i<=15;i++) dp[x][i]=i;
for(int to:g[x]) if(to!=fa){
dfs(to,x); mi[16]=1e9; int tmp=1e9;
for(int j=15;j>=1;j--) mi[j]=min(mi[j+1],dp[to][j]);
for(int j=1;j<=15;j++){
if(j!=1) tmp=min(tmp,dp[to][j-1]);
dp[x][j]+=min(tmp,mi[j+1]);
}
}
}
signed main(){
cin>>n;
for(int i=1,a,b;i<n;i++) scanf("%d %d",&a,&b),add(a,b);
dfs(1,0);
for(int i=1;i<=15;i++) res=min(res,dp[1][i]);
cout<<res;
return 0;
}