一个树形背包优化问题,悬关
  • 板块学术版
  • 楼主xyzfrozen
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/6/29 21:09
  • 上次更新2023/11/3 12:07:20
查看原帖
一个树形背包优化问题,悬关
749714
xyzfrozen楼主2023/6/29 21:09

关于通过控制 sizesize 让每次合并复杂度变成 siza×sizbsiz_a \times siz_b 总复杂度 O(n2)O(n^2) 的优化

Q1Q_1:这个使用有没有什么条件,或者说什么样的题目能用

Q2Q_2:这个题

弱弱用这个方法优化了下,样例错了输出 00,但数据 90pts90pts,错的也是输出 00

悬关求助 record

#include<bits/stdc++.h>
#define pt putchar(' ')
#define nl puts("")
#define pi pair<int,int>
#define pb push_back
#define go(it) for(auto &it:as[x]) //注意加了&
using namespace std;

const int N=310;
int n,m,K,u,v,w;
int f[N][N][2],s[N];
vector<pi> as[N];

int fr(){ //double 不能快读!!!!
    int x=0,flag=1;
    char ch=getchar();
    while(ch<'0' || ch>'9'){
        if(ch=='-') flag=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9'){
        x=x*10+(ch-'0');
        ch=getchar();
    }
    return x*flag;
}
void fw(int x){
	if(x<0) putchar('-'),x=-x;
    if(x>9) fw(x/10);
    putchar(x%10+'0');
}
int max(int a,int b){return a>b?a:b;}
int min(int a,int b){return a<b?a:b;}

void dfs(int x,int rt)
{
	f[x][0][0]=f[x][1][1]=0;
	s[x]=1;
	go(it)
	{
		int v=it.first,w=it.second;
		if(v==rt) continue;
		dfs(v,x);
		for(int j=s[x];~j;j--)
			for(int k=s[v];~k;k--)
			{
				int &T1=f[x][j+k][0],&T2=f[x][j+k][1];
				
				if(j!=s[x] && k!=s[v]) T1=min(T1,f[x][j][0]+f[v][k][0]+(m==2)*w);
				if(j!=s[x]) T1=min(T1,f[x][j][0]+f[v][k][1]);
				
				if(k!=s[v]) T2=min(T2,f[x][j][1]+f[v][k][0]);
				T2=min(T2,f[x][j][1]+f[v][k][1]+w);
			}
		s[x]+=s[v];
	}
}

int main()
{
	n=fr(),m=fr(),K=fr();
	if(K+m-1>n) {puts("-1");return 0;}
	for(int i=1;i<n;i++)
	{
		u=fr(),v=fr(),w=fr();
		as[u].pb({v,w}),as[v].pb({u,w});
	}
	memset(f,0x3f,sizeof f);
	dfs(1,-1);
	fw(f[1][K][1]);
	return 0;
}
2023/6/29 21:09
加载中...