17099 周工作计划安排

时间限制:1000MS  内存限制:65535K
提交次数:0 通过次数:0

题型: 编程题   语言: G++;GCC;VC

 

Description

你正在某信息公司管理一个项目工作团队,每周你必须选择一项工作让团队来承担。
所有的工作分为高压的低压的两类:
(1)低压的,诸如,为小学生建立Web管理网站。低压的项目可以获得li万元。
(2)高压的,诸如,涉及国家秘密或大型商业机遇的项目。高压的项目可以获得hi万元。
且高压项目,必须在前一周用一周的时间来准备(前一周不做任何其他工作)。

你作为项目管理者,每周,要选择一项高压的或低压的工作来做。

问题模型:给定一组值l1,l2,...,ln和h1,h2,...,hn,找出一个最大价值的最优计划。




输入格式

第一行:n   ( 这里,n<10000 )
第二行:l1 l2 ... ln
第三行:h1 h2 ... hn



输出格式

团队所能获得的最大价值。



 

输入样例

4
10 1 10 10
5 50 5 1



 

输出样例

70

解释:
最优安排:第一周不安排,为第二周高压工作,第二周选择高压工作,第三第四周低压工作。
最优价值:0+50+10+10=70



 

提示

先定义符号:n个星期,每个星期可选择一个低压项目,或一个高压项目(高压项目前一周不工作)
低压可产生价值:l1 l2 ... ln
高压可产生价值:h1 h2 ... hn

假设d[i]代表第i周选择项目后,产生的最大效益和。
(1)当i=1时,因为无准备周,无法选择高压项目,只能选低压项目来做。d[i]=l1;
(2)当i=2时,d[i]=max{l1+l2, h2};
(3)当i>1时,d[i]=max{d[i-1]+li,d[i-2]+hi}。

最后,d[n]就是原问题n个星期选择项目能产生的最大价值和。



我的代码实现:


#include<stdio.h>
#define N 10005
int d[N];


//(1)当i=1时,因为无准备周,无法选择高压项目,只能选低压项目来做。d[i]=l1;
//(2)当i=2时,d[i]=max{l1+l2, h2};
//(3)当i>1时,d[i]=max{d[i-1]+li,d[i-2]+hi}。

int max(int x,int y){
    return x>y?x:y;
}

void aa(int *low,int *high,int n){
    d[1]=low[1];
    d[2]=max(low[1]+low[2],high[2]);
    for(int i=2;i<=n;i++){
        d[i]=max(d[i-1]+low[i],d[i-2]+high[i]);
    }
}


int main(){
    int l[N],h[N];
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%d",&l[i]);
    }
    for(int i=1;i<=n;i++){
        scanf("%d",&h[i]);
    }
    aa(l,h,n);
    printf("%d ",d[n]);
    return 0;
} 

 

 
posted on 2017-12-27 22:22  TinyRick  阅读(375)  评论(0编辑  收藏  举报