AT5147-[AGC036D]Negative Cycle【dp,模型转换】

1|0正题

题目链接:https://www.luogu.com.cn/problem/AT5147


1|1题目大意

n个点的一张图,其中ii+1(i<n)有一条边权值为0

对于其他i,j(ij)存在一条边ij,若i<j那么权值为1,否则为1

删除ij(ij)的代价为ai,j,要求代价最小的情况下使得图中不存在负环。

1n500


1|2解题思路

这个容易负环让人一头雾水不知道怎么维护,我们知道差分约束有解的条件就是没有负环,所以我们可以考虑转成差分约束模型。

那么对于不能删除的边ii+1就有限制xixi+1,也就是整个序列单调不升。

然后形如ij(i<j)可以视为xi1xj
形如ij(i<j)可以视为xixj+1

也就是xixj1xixj1的限制,我们考虑维护差分数组(反过来的)yi=xi1xi,那么条件就是区间和不能大于/小于1,显然的那么yi就只有可能是0/1

然后仔细观察这个限制会发现其实只有相邻的1会有用,我们考虑dp来处理,设fi,j,k表示做到第i个,上一个1j处,再上一个1k处。

前缀和一下a数组优化转移即可。

时间复杂度:O(n3)


1|3code

#include<cstdio> #include<cstring> #include<algorithm> #define ll long long using namespace std; const ll N=510; ll n,a[N][N],s[N][N],t[N][N],f[N][N],ans; signed main() { scanf("%lld",&n); for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++){ if(i==j)continue; scanf("%lld",&a[i][j]); } for(ll i=1;i<=n;i++) for(ll j=1;j<=i;j++) s[i][j]=s[i][j-1]+a[j][i], t[i][j]=t[i][j-1]+a[i][j]; memset(f,0x3f,sizeof(f)); ans=f[0][0];f[1][1]=0; for(ll i=2;i<=n;i++){ for(ll j=1;j<i;j++) for(ll k=1;k<=j-(j!=1);k++) f[i][j]=min(f[i][j],f[j][k]); for(ll j=1;j<=i;j++) for(ll k=1;k<=j-(j!=1);k++) f[j][k]+=s[i][i]-s[i][j-1],f[j][k]+=t[i][k-1]; } for(ll i=1;i<=n;i++) for(ll j=1;j<=n;j++) ans=min(ans,f[i][j]); printf("%lld\n",ans); return 0; }

__EOF__

本文作者QuantAsk
本文链接https://www.cnblogs.com/QuantAsk/p/16482557.html
关于博主:退役OIer,GD划水选手
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   QuantAsk  阅读(40)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 张高兴的大模型开发实战:(一)使用 Selenium 进行网页爬虫
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
历史上的今天:
2021-07-15 AT2305-[AGC010D]Decrementing【博弈论】
2021-07-15 AT5661-[AGC040C]Neither AB nor BA【模型转换】
2021-07-15 CF573D-Bear and Cavalry【动态dp】
2021-07-15 CometOJ-[Contest #10]鱼跃龙门【exgcd】
2021-07-15 jzoj5101-[GDOI2017day2]凡喵识图【鸽笼原理】
2021-07-15 P1791-[国家集训队]人员雇佣【最大权闭合图】
点击右上角即可分享
微信分享提示