Problem Description
每個畫家有且僅有一種顏色的顏料,每個畫家的顏料都是不同顏色的。
這裏我們假定畫家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
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;
- }