zoukankan      html  css  js  c++  java
  • 暑假集训Day 10 小烈送菜

    题目大意

    小烈一下碰碰车就被乐满地的工作人员抓住了。作为扰乱秩序的惩罚,小烈必须去乐满地里的“漓江村”饭店端盘子。

    服务员的工作很繁忙。他们要上菜,同时要使顾客们尽量高兴。一位服务生为n个顾客上菜。这n个顾客坐成一排,小烈从一端的厨房中端出n盘菜(不要问我为什么小烈能一下子端住2500 盘菜,他就是能)为n个顾客各上一道相同的菜。

    显然,小烈需要走一个来回,如图:

    本来,小烈可以按1,2,3,...n的顺序一次给每个顾客上菜,但是,聪明的小烈通过观察发现,每个顾客都有一个开心值 H,离厨房最近的为H1 ,然后依次为(H_2),(H_3)...(H_n) 。若小烈给第j位顾客上菜前刚刚为第i位顾客上菜,则第j位就会高兴,产生高兴指数(W_j =H_i*H_j)。这样,如果小烈按一定的方式调整上菜顺序,可以得到更高的高兴指数。现在小烈想知道用某一方法可达到的n位顾客高兴指数之和的最大值S。因为顾客越高兴,给小烈的小费越多。第一位上菜的顾客不产生高兴值。

    输入格式

    第一行一个整数n,顾客的数目。
    第二行n个数,第i个数表示第i位顾客的开心值。各个数字用空格隔开。

    输出格式

    一个数s,为高兴指数的最大值。

    样例

    样例输入

    3
    7 1 9
    

    样例输出

    72
    

    算法分析

    • 这个题第一眼看上去好像没啥思路 虽然能一眼裸爆出是dp 但是状态和转移限制异常的多
    • 小烈要去一个来回 去的时候获得的权值回来的时候就不能获得了 那如果我们将一个小烈劈开(还是让他分身吧) 现在我们有两个小烈 一起向前走 f[i][j]表示第一个小烈走到i 第二个小烈走到j而且此时前max(i,j)个客人都已经送好菜了,所能获得的最大值
    • 如果当前状态是i 如何转移到i+1呢? 因为i+1必须要由小烈a或者小烈b其中的一个去送 所以可以由多个状态转移过来
    f[i+1][j] = max(f[i][j],f[i+1][j] + a[i+1]*a[i])//由i位置转移过来
    f[i][i+1] = max(f[i][i+1],f[i][j] + a[i+1]*a[j])//由j位置转移过来
    
    • 但是这样的动态转移方程显然很ex,毕竟一堆限制条件 再来仔细品 因为要保证前max(i,j)的位置都要送到 所以f[i][j]和f[j][i]是等效的 毕竟谁在前面都一样
    • 所以我们的状态转移方程就可以表示为
    f[i+1][j] = max(f[i][j],f[i+1][j] + a[i+1]*a[i])
    f[i+1][i] = max(f[i][i+1],f[i][j] + a[i+1]*a[j])
    

    代码展示

    #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 2500+10;
    int a[maxn],f[maxn][maxn];
    
    int main(){
    	int n,ans = 0;
    	scanf("%d",&n);
    	for(int i = 1;i <= n;++i)scanf("%d",&a[i]);
    	for(int i = 1;i <= n;++i)
    		for(int j = 0;j < i;++j){
    			f[i+1][j] = max(f[i][j] + a[i+1]*a[i],f[i+1][j]);
    			f[i+1][i] = max(f[i][j] + a[i+1]*a[j],f[i+1][i]);
    		}
    	for(int i = 0;i < n;++i)ans = max(ans,f[n][i] + a[n]*a[i]);
    	printf("%d",ans);
    	return 0;
    }
    
  • 相关阅读:
    WinForm高级控件--PictureBox控件(图片控件)
    改变GridView中列的宽度
    RabbitMq笔记()
    参数可传可不传
    C# 视频讲解
    <ItemTemp>里写判断语句
    MyEclipse 2017 CI 10 发布(附下载)
    DevExpress v17.2新版亮点—WPF篇(四)
    DevExpress XtraScheduler日程管理控件应用实例(2)-- 深入理解数据存储
    MyEclipse移动开发教程:设置所需配置的iOS应用(三)
  • 原文地址:https://www.cnblogs.com/2004-08-20/p/13227232.html
Copyright © 2011-2022 走看看