2025.2.5

dp
latex炸了回头在再修

P2365 任务安排

题外话:斜率优化和四边形这种都是很特定的优化。这个题好老阿

由于任务排成序列顺序不得改变,所以考虑从前往后进行状态转移,和我今天做了一个‘P8590’其中对于我们值的拆分很像。

开始设计状态,dp[i]表示前i个任务的最小费用,我们在计算费用的时候每一种任务都是需要时间和费用相乘,所以也要记录时间

转移方程$ dp[i]=min(dp[j]+sumt[i]\sum_{k=j+1}^{i} sumf)+s\sum_{k=j+1}^{n}$

首先需要排除掉斜率很小的点,然后在插入i点后维护下凸壳

	for(int i=1;i<=n;i++)
	{
		while(l<r&&dp[q[l+1]]-dp[q[l]]<=(s+sumt[i])*(sumf[q[l+1]]-sumf[q[l]]))
		l++;
		
		dp[i]=dp[q[l]]-(s+sumt[i])*sumf[q[l]]+sumt[i]*sumf[i]+s*sumf[n];
		
		while(l<r&&(dp[q[r]]-dp[q[r-1]])*(sumf[i]-sumf[q[r]])>=(dp[i]-dp[q[r]])*(sumf[q[r]]-sumf[q[r-1]]))
		r--;
		q[++r]=i;
	}

杂项

采药裸背包;数字三角形更裸;神奇的四次方数是变相背包,由于数据范围一定,所以四次方数就相当于物品;汤姆斯的天堂梦从上往下,$dp[i]=min(dp[i],l[x]+y)$,y是这条的支出,x是相连星球,或者暴力一点写成二维,到ij的星球最小花费,或者建图跑个spfa转移。

P1880 石子合并

典中典之四边形不等式,状态转移本身很裸

注意是环形,所以跑个2n的链

	for(int len=1;len<n;len++)
	{
		for(int i=1,j=i+len;i<n*2&&j<n*2;i++,j=i+len)
		{
			a1[i][j]=0x3f3f3f3f;
			for(int k=i;k<j;k++)
			{
				a2[i][j]=max(a2[i][k]+a2[k+1][j]+s[j]-s[i-1],a2[i][j]);
				a1[i][j]=min(a1[i][k]+a1[k+1][j]+s[j]-s[i-1],a1[i][j]);
			}
		}
	}
	int maxx=0,minn=0x3f3f3f3f;
	for(int i=1;i<=n;i++)  
    {  //遍历,更新最值
        maxx=max(maxx,a2[i][i+n-1]);  
        minn=min(minn,a1[i][i+n-1]);  
    }  

UVA1640统计问题

P10447 最短 Hamilton 路径

不看标签和数据范围还真没反应过来

设计$dp[i][j]$,其中i为状态,10表示该位的点有没有走过

每次判断这个状态和我们枚举的点冲不冲突

j是当前点,k是上一个点,然后判断到达k点的状态是是否冲突

for(int i=1;i<(1<<n);i++)
	{
		for(int j=0;j<n;j++)
		{
			if((i>>j)&1)
			{
				for(int  k=0;k<n;k++)
				 {
				 	dp[i][j]=min(dp[i][j],dp[i^(1<<j)][k]+a[k][j]);
				 	
				 }
			}
		}
	}

P1352 没

P1352 没有上司的舞会

裸树形dp

void dfs(int x,int y)
{		
dp1[x]=0;
dp2[x]=c[x];
for(int i=head[x];i;i=nxt[i])
	{int e=to[i];
		if(to[i]!=y)
		{
			dfs(e,x);
			dp1[x]+=max(dp1[e],dp2[e]);
			dp2[x]+=dp1[e];
		}
	}
	return ;
}
posted @ 2025-02-05 19:34  Hehe_o  阅读(16)  评论(0编辑  收藏  举报