hdu 5905 Black White Tree 트리 dp

1778 단어 동적 기획
우리는 하위 나무에 대해 만약에 그의 노드 수가 고정된다면 검은 점수는 반드시 연속적으로 변화할 것이라고 생각할 수 있다. 그러면 우리는 각 하위 나무 크기의 검은 점의 최대치와 최소치를 쉽게 찾을 수 있다. 즉, dp[i]는 하위 나무 크기가 i의 검은 점의 최대치이고 dp1[i]은 최소치이며 나머지는 dp이다.
#include
#include
#include
#include
#include
using namespace std;
const int maxn=2004;
int dp[maxn][maxn],dp1[maxn][maxn];
int ma[maxn],mi[maxn];
int size[maxn];
vectorg[maxn];
int a[maxn];
int be[maxn][maxn],en[maxn][maxn];
void dfs(int u,int pa){
    size[u]=1;
    for(int v:g[u]){
        if(v!=pa){
            dfs(v,u);
            size[u]+=size[v];
        }
    }
}
int cmp(int a,int b){
    return size[a]0;j--){
                for(int i=1;i<=size[v];i++){
                    dp[u][i+j]=max(dp[u][i+j],dp[u][j]+dp[v][i]);
                    dp1[u][i+j]=min(dp1[u][i+j],dp1[u][j]+dp1[v][i]);
                }
            }
            all+=size[v];
        }
    }
    for(int i=1;i<=size[u];i++){
        be[i][dp1[u][i]]++;
        be[i][dp[u][i]+1]--;
    }
}
char c[maxn];
int main()
{
    int t,n;
    cin>>t;
    while(t--){
        scanf("%d",&n);
        for(int i=1;i<=n;i++) g[i].clear();
        for(int i=0;i<=n;i++){
            for(int j=0;j<=i;j++){
                be[i][j]=0;
            }
        }
        be[0][0]=1;
        scanf("%s",c);
        for(int i=1;i<=n;i++) a[i]=c[i-1]-'0';
        for(int i=1;i

좋은 웹페이지 즐겨찾기