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 ;
}