【Luogu】 P5774 [JSOI2016]病毒感染

news/2024/10/21 13:39:55/

题目链接

点击打开链接

题目解法

  • 这道题题目描述中有个问题,应该是

J Y Y JYY JYY 从村庄 j j j 前往村庄 k k k,并满足 ∣ k − i ∣ < ∣ i − j ∣ ∣k−i∣<∣i−j∣ ki∣<∣ij

根据上面的条件可以推断出 J Y Y JYY JYY 行走的路一定是一段连着一段的,即从一段的开头往末尾走,然后再回到开头,把原先没有治愈的村庄治愈,再到下一段的开头继续往后走
由此可以预处理出 d p [ l ] [ r ] dp[l][r] dp[l][r] 表示走 l l l r r r 的一段的最小代价,行走的路线是 l − > r − > l l->r->l l>r>l
考虑转移,可以发现 d p [ l + 1 ] [ r ] dp[l+1][r] dp[l+1][r] 的路线是 l + 1 − > r − > l + 1 l+1->r->l+1 l+1>r>l+1,比较好转移到 d p [ l ] [ r ] dp[l][r] dp[l][r],所以有 d p [ l + 1 ] [ r ] dp[l+1][r] dp[l+1][r] 转移到 d p [ l ] [ r ] dp[l][r] dp[l][r],只需要考虑 l l l 是一开始就被治愈还是返回来在被治愈

  1. 一开始就被治愈
    d p [ l ] [ r ] = d p [ l + 1 ] [ r ] + 2 ∗ ( s u m [ r ] − s u m [ l ] ) dp[l][r]=dp[l+1][r]+2*(sum[r]-sum[l]) dp[l][r]=dp[l+1][r]+2(sum[r]sum[l])
    l + 1 l+1 l+1 r r r 的村庄会多死 2 2 2 天的人
  2. 返回时再被治愈
    d p [ l ] [ r ] = d p [ l + 1 ] [ r ] + s u m [ r ] − s u m [ l ] + ( r − l ) ∗ 3 ∗ a [ l ] dp[l][r]=dp[l+1][r]+sum[r]-sum[l]+(r-l)*3*a[l] dp[l][r]=dp[l+1][r]+sum[r]sum[l]+(rl)3a[l]
    l + 1 l+1 l+1 r r r 的村庄会多死 1 1 1 天的人,而 l l l 村庄会多死 3 ( r − l ) 3(r-l) 3(rl) 天的人,因为回到 l l l 时, l + 1 l+1 l+1 r r r 的村庄都已经花了一天时间被治愈

计算答案考虑 f [ i ] f[i] f[i] 表示 1 − i 1-i 1i 每个村庄都被治愈,现在 J Y Y JYY JYY 再第 i + 1 i+1 i+1 个村庄的最小代价
可以考虑代价提前计算,把 i + 1 i+1 i+1 n n n 村庄在当前时间段死的人都提前记录进 f f f
转移式即为 f [ i ] = m i n { f [ j − 1 ] + d p [ j ] [ i ] + ( 4 ∗ ( i − j ) + 2 ) ∗ ( s u m [ n ] − s u m [ i ] ) } f[i]=min\{f[j-1]+dp[j][i]+(4*(i-j)+2)*(sum[n]-sum[i])\} f[i]=min{f[j1]+dp[j][i]+(4(ij)+2)(sum[n]sum[i])}

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N(3100);
int n,a[N],sum[N],dp[N][N],f[N];
inline int read(){int FF=0,RR=1;char ch=getchar();for(;!isdigit(ch);ch=getchar()) if(ch=='-') RR=-1;for(;isdigit(ch);ch=getchar()) FF=(FF<<1)+(FF<<3)+ch-48;return FF*RR;
}
signed main(){n=read();for(int i=1;i<=n;i++) a[i]=read(),sum[i]=sum[i-1]+a[i];for(int len=2;len<=n;len++)for(int l=1,r=len;r<=n;l++,r++)dp[l][r]=min(dp[l+1][r]+2*(sum[r]-sum[l])/*开始就治愈i村庄*/,dp[l+1][r]+sum[r]-sum[l]+(r-l)*3*a[l]/*回来时在治愈i村庄*/);memset(f,0x3f,sizeof(f));f[0]=0;for(int i=1;i<=n;i++)for(int j=1;j<=i;j++)f[i]=min(f[i],f[j-1]+dp[j][i]+(4*(i-j)+2)*(sum[n]-sum[i]));printf("%lld",f[n]);return 0;
}

http://www.ppmy.cn/news/461270.html

相关文章

Spring 生命周期详解:从初识到精通

Spring 生命周期详解&#xff1a;从初识到精通 了解 Spring 生命周期对于我们更好地运用它非常重要。本篇文章力图用易懂、有趣的方式带你深入剖析 Spring 生命周期&#xff0c;让你成为 Spring 开发的专家。 目录 一、Spring 生命周期简介 1.1 Spring 程序启动过程1.2 Spri…

高级商务办公软件应用【1】

1.如要在EXCEL输入分数形式&#xff1a;1/3&#xff0c;下列方法正确的是 A.直接输入1/3 B.先输入双引号&#xff0c;再输入1/3 C.先输入单引号&#xff0c;再输入1/3 D.先输入0&#xff0c;然后空格&#xff0c;再输入1/3 2.关于排序&#xff0c;下列说法中&#xff08;&…

商务办公软件应用与实践【2】

1.在Excel2010中&#xff0c;假定一个工作表中的单元格B2的内容为2011/12/20&#xff0c;则函数month(B2)的值为&#xff08;&#xff09;。 A.2012 B.20 C.2011 D.12 2.把单词cta改成cat&#xff0c;再把teh改成the后&#xff0c;单击"撒消上一次”按钮会显示&#xff…

商务办公软件应用与实践【7】

1.PowerPoint中选择了某种设计模板&#xff0c;幻灯片原来的背景是否显示&#xff08;&#xff09;。 A.不能忽略模板 B.可以选择 C.不能选择 D.不改变 2.Powerpoint中自定义动画中引入文本选项有那些&#xff08;&#xff09;。 A.整批发送 B.按字母 C.按数字 D.按字 3.Po…

高级商务办公软件应用【12】

1.在Word2010中&#xff0c;如果要在文档的每一页中出现相同的文字内容&#xff0c;这些文字应放在页眉页脚中。 2.Excel2010中&#xff0c;在单元格中输入文字时缺省的对齐方式&#xff0c;正确的是&#xff08;&#xff09;。 A.居中对齐 B.左对齐 C.右对齐 D.两端对齐 3.…

高级商务办公软件应用【6】

1.在Excel2010中公式“Count(C2,C6)”的作用是求C2和C6这两个单元格数据之和。 2.关闭所有演示文稿后会自动退出PowerPoint系统。 3.在Word2010中&#xff0c;审阅时&#xff0c;对于文档中的所有修订标记只能全部接受或全部拒绝。 4.在Word2010中插入一个分栏符能够将页面分…

高级商务办公软件应用【4】

1.在WORD中&#xff0c;可以采用&#xff08;&#xff09;功能输入特殊符号、当前日期、时间等。 A.插入 B.视图 C.布局 D.开始 2.已知EXCEL某工作中的D1单元格等于1&#xff0c;D2单元格等于2&#xff0c;D3单元格等于3&#xff0c;D4单元格等于4&#xff0c;D5单元格等于5&…

python在日常办公中的应用,python在办公方面的运用

最近经常听到Python&#xff0c;Python在我们的生活中会有哪些应用&#xff1f; python的几大方向&#xff1a;web开发&#xff08;django、flask模块&#xff09;爬虫开发&#xff08;scrapy、pyspider等模块&#xff09;人工智能、机器学习桌面开发&#xff08;GUI开发&…