UVA_662

首先我们考虑区间[i,j]内如果建一个餐馆应该建在哪个位置,比较容易证明应该是建在中间的位置,如果是偶数个元素,中间两个位置随便一个都可以。这样我们就可以预处理出区间[i,j]内建一个餐馆的最小总路程A[i][j]了。

我们可以用f[i][j]表示第i个餐馆服务到第j个位置所需的最小总路程,那么f[i][j]=min{f[i-1][k]+A[k+1][j]},其中i-1<=k<j。

#include<stdio.h>#include<string.h>#define MAXD 210#define MAXK 40#define INF 0x3f3f3f3fint N, K, f[MAXK][MAXD], p[MAXK][MAXD], a[MAXD], b[MAXD];int A[MAXD][MAXD], s[MAXD];int init(){int i, j, k, temp;    scanf("%d%d", &N, &K);if(!N && !K)return 0;    s[0] = 0;for(i = 1; i <= N; i ++)    {        scanf("%d", &a[i]);        s[i] = a[i] + s[i - 1];    }for(i = 1; i <= N; i ++)for(j = i; j <= N; j ++)        {            k = (i + j) / 2;            temp = s[j] - s[k] - (j - k) * a[k];            temp += (k - i) * a[k] - s[k - 1] + s[i - 1];            A[i][j] = temp;        }return 1;}void printpath(int k, int n){int t = p[k][n];if(k != 1)        printpath(k - 1, t);    printf("Depot %d at restaurant %d serves restaurants %d to %d\n", k, (t + 1 + n) / 2, t + 1, n);}void solve(){int i, j, k, min;    memset(f, 0x3f, sizeof(f));for(k = 1; k <= N; k ++)        f[1][k] = A[1][k];for(i = 2; i <= K; i ++)for(j = i; j <= N; j ++)for(k = i - 1; k < j; k ++)            {if(f[i - 1][k] + A[k + 1][j] < f[i][j])                {                    f[i][j] = f[i - 1][k] + A[k + 1][j];                    p[i][j] = k;                }            }    printpath(K, N);    printf("Total distance sum = %d\n", f[K][N]);}int main(){int t = 0;while(init())    {        printf("Chain %d\n", ++ t);        solve();        printf("\n");    }return 0;}

转载于:https://www.cnblogs.com/staginner/archive/2011/12/04/2276147.html

UVA 662 Fast Food相关推荐

  1. UVA 662 Fast Food(dp)

    题意: 一条直线马路上有n个餐馆,各个餐馆的坐标为di. 现在要在这n个餐馆中选择k个餐馆用来建造仓库. 没有仓库的餐馆,只能使用附近最近的一个仓库. 问总距离最少的建造方案,并输出. 思路: 先进行 ...

  2. UVA - 662 Fast Food

    怎么说呢,我一直希望自己能独立的想出从没见过的类型的题目,但基本上从来没有过,究竟是自己不够聪明还是说这就是变聪明的过程??但除了第二个答案我别无选择... 首先要想清楚一段restruant只有取中 ...

  3. UVA 662 - Fast Food

    题目链接~~> 做题感悟: 这题因为输出的时候没有看到单复数,wa了老半天,无语,净犯这些低级错误. 解题思路: (1) . 看这题首先想到区间 dp ,一段区间如果要找一个服务的饭店那是一定的 ...

  4. UVA 11992 - Fast Matrix Operations(段树)

    UVA 11992 - Fast Matrix Operations 题目链接 题意:给定一个矩阵,3种操作,在一个矩阵中加入值a,设置值a.查询和 思路:因为最多20列,所以全然能够当作20个线段树 ...

  5. uva 11992 - Fast Matrix Operations

    简单的线段树的题: 有两种方法写这个题,目前用的熟是这种慢点的: 不过不知道怎么老是T: 感觉网上A过的人的时间度都好小,但他们都是用数组实现的 难道是指针比数组慢? 好吧,以后多用数组写写吧! 超时 ...

  6. uva 11992 Fast Matrix Operations

    这道题很狗血啊 赋值的时候那个v是大于等于0来着,主要考察区间赋值和更新,pushdown同时要有两个操作.代码如下: 1 #include<cstdio> 2 #include<c ...

  7. 线段树(多维+双成段更新) UVA 11992 Fast Matrix Operations

    题目传送门 题意:训练指南P207 分析:因为矩阵不超过20行,所以可以建20条线段的线段树,支持两个区间更新以及区间查询. #include <bits/stdc++.h> using ...

  8. 提取了下刘汝佳推荐的题号...

    今天闲来没事上uva oj提取了下刘汝佳推荐的acm题号,原始数据如下: Volume 0. Getting Started    10055 - Hashmat the Brave Warrior ...

  9. 【UVA】11992 - Fast Matrix Operations(段树模板)

    主体段树,要注意,因为有set和add操作,当慵懒的标志下推.递归优先set,后复发add,每次运行set行动add马克清0 WA了好几次是由于计算那一段的时候出问题了,可笑的是我对着模板找了一个多小 ...

最新文章

  1. Java知多少(中)
  2. jquery extend函数
  3. MySQL体系结构和存储引擎概述
  4. Python中的test测试
  5. 录屏 模拟器_Scrcpy-在电脑无缝操作手机 (投屏/录屏/免Root)
  6. Python内置函数教程
  7. 《SAS编程与数据挖掘商业案例》学习笔记之十一
  8. 基于Kubernetes的持续部署方案
  9. 查看此docker网络连接模式_Docker:网络模式详解
  10. java中的基本小程序_12个用Java编写基础小程序经典案例(收藏篇)
  11. 数据:灰度比特币信托基金溢价达41%创近一年新高
  12. 几种常见的分布及其性质
  13. 三分钟训练眼球追踪术,AI就知道你在盯着哪个妹子 | TensorFlow.js代码
  14. Stm32CubeMx lwip+freeRTOS TCP 服务
  15. [Python] 进制转换
  16. 交叉熵损失的来源、说明、求导与pytorch实现
  17. Sencha Touch 心得
  18. 基于GAN的动漫头像生成
  19. html电话号码隐藏样式,打电话不显示号码怎么设置(教你打电话隐藏号码)
  20. 脱掉“爱加密”家的壳

热门文章

  1. mysqls压力测试怎么用_阿里研究员:测试稳定性三板斧,我怎么用?
  2. cdockpane限制调整大小_影视后期制作小伙伴必看:使用AU对声音质量进行调整的三大技巧...
  3. qq五笔linux,QQ五笔 - 五笔小字典 QQ绑定很实用
  4. java jdbc连接db2数据库_Java连接db2数据库(常用数据库连接五)
  5. 头部ct能检查出什么_【安全用药】做CT检查时应注意什么?
  6. 10位IT领袖给应届毕业生的10条忠告
  7. 靶场练习第二十五天~vulnhub靶场之Raven-2
  8. math.ceil带小数点_JavaScript中带有示例的Math.ceil()方法
  9. Anti-Screen Capture(Prevent Screen Captures)截屏与反截屏
  10. windows内核情景分析---进程线程2