[Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742
生活随笔
收集整理的這篇文章主要介紹了
[Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
分析:
首先,連續選擇一段必定最優...
區間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 <cstdio> #include <cmath> #include <algorithm> #include <cstdlib> #include <cstring> #include <queue> #include <iostream> #include <set> using namespace std; #define N 1005 long 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
總結
以上是生活随笔為你收集整理的[Usaco2005 nov]Grazing on the Run 边跑边吃草 BZOJ1742的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [Jobdu] 题目1527:首尾相连数
- 下一篇: 【第一章】 Spring概述 —— 跟我