dp
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 路径
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 ;
}