dp模拟

Problem Description

艺术协会有N个画家,他们决定按照如下规则一起工作:

每个画家有且仅有一种颜色的颜料,每个画家的颜料都是不同颜色的。
这里我们假定画家1使用颜色1,画家2使用颜色2……以此类推。
每一幅画包含所有N种颜色,把第j种颜色画到第i幅画上需要消耗t(ij)个单位的时间。

作画的顺序也是很重要的,所以画家们的工作顺序满足如下要求:

·每幅画必须先由第一个画家画,然后由第二个画家画……以此类推,也就是说当第j个画家在某幅作品上完成工作后,接下来一定是由第j+1位画家继续在这副作品上作画(j
·每个画家的作画顺序也是有要求的:首先画第一幅画,然后第二幅画……以此类推。
·每个画家最多同时在一副画上作画。不过他们不需要休息。
·一旦第j位画家在某幅画上完成了工作,第j+1位画家会立刻在这幅画上开始他的工作。

假定开始的时间是0,计算出每幅画完工的时间。

Input

多组测试数据,请处理到文件结束。
每组测试数据第一行包含两个整数m,n (1≤m≤50000,1≤n≤5),其中m表示画作的数量,n表示画家的数量,接下来m行,每行n个整数t(ij),每个数字代表第j个画家在第i福画上需要工作的时间,这里满足1<=t(ij)<=1000。

Output

对于每组测试数据输出m个数的序列r1,r2……rm,这里ri表示第i福作品的完成时间。

Sample Input

5 1 
2
3
4
5
4 2
2 5
3 1
5 3 
10 1

Sample Output

1 3 6 10 15
7 8 13 21

简要说一下思路:
假设有m行n列不(这无需关心m=1,n=1的特殊情况),数组a[i]记录第i幅画完成需要的时间,我们可以假设有一二维数组,但无需保持,故用b[j]代替,将第j列的数的第i行以前的数相加存在b[j]中比较b[j+i]与b[j]+[i][j+1]的大小,由于后一个画家的作画受前一个的限制,故取较大值

代码如下:

  1. #include
  2. #include
  3. #include
  4. using namespace std;
  5. int a[50005];
  6. int b[7];
  7. int main(){
  8.     int m,n;
  9.  
  10.     while(~scanf("%d%d",&m,&n)){
  11.         int s;
  12.         b[0]=0;
  13.         for(int i=1;i<=n;i++)
  14.             {
  15.                 scanf("%d",&b[i]);
  16.                 //cin>>b[i];
  17.                 b[i]=b[i]+b[i-1];
  18.                 }
  19.            a[1]=b[n];
  20.         for(int i=2;i<=m;i++){
  21.             for(int j=1;j<=n;j++)
  22.             {
  23.                 scanf("%d",&s);
  24.                 //cin>>s;
  25.                 b[j]=max(b[j-1]+s,b[j]+s);
  26.             }
  27.             a[i]=b[n];
  28.         }
  29.         printf("%d",a[1]);
  30.         for(int i=2;i<=m;i++)
  31.             printf(" %d",a[i]);
  32.         printf("\n");
  33.             //cout<<a[i]<<endl;
  34.     }
  35.     return 0;
  36. }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值