博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742
阅读量:4685 次
发布时间:2019-06-09

本文共 1103 字,大约阅读时间需要 3 分钟。

分析:

首先,连续选择一段必定最优...

区间DP,f[i][j]表示从i开始,连续j个被吃掉了,并且,牛在i处,g[i][j]则表示在i+j-1处

f[i][j]可以从g[i+1][j]和f[i+1][j]转移,g[i][j]可以从g[i][j-1]和f[i][j-1]转移,转移方程:

f[i][j]=min(f[i+1][j]+(n-j+1)*(a[i+1]-a[i]),g[i+1][j]+(n-j+1)*(a[i+j-1]-a[i]));g[i][j]同样...

附上代码:

#include 
#include
#include
#include
#include
#include
#include
#include
using namespace std;#define N 1005long long f[N][N],g[N][N];int n,L,a[N];int main(){ memset(f,0x3f,sizeof(f));memset(g,0x3f,sizeof(g)); scanf("%d%d",&n,&L); for(int i=1;i<=n;i++)scanf("%d",&a[i]); sort(a+1,a+n+1); int p=lower_bound(a+1,a+n+1,L)-a; if(p!=1)f[p-1][1]=g[p-1][1]=1ll*n*(L-a[p-1]); if(a[p]>=L)f[p][1]=g[p][1]=1ll*n*(a[p]-L); for(int i=2;i<=n;i++) { for(int j=1;j<=n-i+1;j++) { int k=i+j-1; f[j][i]=min(f[j+1][i-1]+(n-i+1)*(a[j+1]-a[j]),g[j+1][i-1]+(n-i+1)*(a[k]-a[j])); g[j][i]=min(f[j][i-1]+(a[k]-a[j])*(n-i+1),g[j][i-1]+(a[k]-a[k-1])*(n-i+1)); } } printf("%lld\n",min(f[1][n],g[1][n])); return 0;}

  

转载于:https://www.cnblogs.com/Winniechen/p/9048142.html

你可能感兴趣的文章
大端模式和小端模式
查看>>
mysql灾备演练问题
查看>>
互娱3.31一面
查看>>
Jmeter九、jmeter中的函数和beanshell
查看>>
Django+xadmin 打造线上教育平台(二)登录-注册(重制)
查看>>
DevExtreme 学习应用[2]
查看>>
C++ string和int相互转换
查看>>
java解压缩zip
查看>>
Android 样式布局
查看>>
C#中小数点后保留两位小数,四舍五入的函数及使用方法(转)
查看>>
CF GYM 100703A Tea-drinking
查看>>
Servlet 与 Ajax 交互一直报status=parsererror
查看>>
python 字符串转变量方法
查看>>
接口型模式
查看>>
C#中使用SqlBulkCopy的批量插入和OracleBulkCopy的批量插入
查看>>
vue2.0读书笔记1-基础
查看>>
转iphone如何调试EXC_BAD_ACCESS
查看>>
session 与 cookie的区别用法
查看>>
decorator在Python中的作用
查看>>
详谈kubernetes滚动更新-1
查看>>