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. }
發佈了30 篇原創文章 · 獲贊 13 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章