Problem Description
艺术协会有N个画家,他们决定按照如下规则一起工作:
每个画家有且仅有一种颜色的颜料,每个画家的颜料都是不同颜色的。
这里我们假定画家1使用颜色1,画家2使用颜色2……以此类推。
每一幅画包含所有N种颜色,把第j种颜色画到第i幅画上需要消耗t(ij)个单位的时间。
作画的顺序也是很重要的,所以画家们的工作顺序满足如下要求:
·每幅画必须先由第一个画家画,然后由第二个画家画……以此类推,也就是说当第j个画家在某幅作品上完成工作后,接下来一定是由第j+1位画家继续在这副作品上作画(j
·每个画家的作画顺序也是有要求的:首先画第一幅画,然后第二幅画……以此类推。
·每个画家最多同时在一副画上作画。不过他们不需要休息。
·一旦第j位画家在某幅画上完成了工作,第j+1位画家会立刻在这幅画上开始他的工作。
假定开始的时间是0,计算出每幅画完工的时间。
每个画家有且仅有一种颜色的颜料,每个画家的颜料都是不同颜色的。
这里我们假定画家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。
每组测试数据第一行包含两个整数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
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]的大小,由于后一个画家的作画受前一个的限制,故取较大值
代码如下:
- #include
- #include
- #include
- using namespace std;
- int a[50005];
- int b[7];
- int main(){
-
int m,n; -
-
while(~scanf("%d%d",&m,&n)){ -
int s; -
b[0]=0; -
for(int i=1;i<=n;i++) -
{ -
scanf("%d",&b[i]); -
//cin>>b[i]; -
b[i]=b[i]+b[i-1]; -
} -
a[1]=b[n]; -
for(int i=2;i<=m;i++){ -
for(int j=1;j<=n;j++) -
{ -
scanf("%d",&s); -
//cin>>s; -
b[j]=max(b[j-1]+s,b[j]+s); -
} -
a[i]=b[n]; -
} -
printf("%d",a[1]); -
for(int i=2;i<=m;i++) -
printf(" %d",a[i]); -
printf("\n"); -
//cout<<a[i]<<endl; -
} -
return 0; - }