ZOJ 1183 - Scheduling Lectures

set opt[i][j] for the the min time of using i lessons cover the 1..j topics.
    opt[i][j] = min{ opt[i - 1][j - k] + d(j - k + 1 .. j) }

 1  /*  Accepted 1183 C++ 00:01.91 4760K  */
 2  #include  < iostream >
 3 
 4  using   namespace  std;
 5 
 6  int  main()
 7  {
 8       int  N;
 9      cin  >>  N;
10       while (N -- )
11      {
12           int  n, l, c, t[ 1001 ], Case  =   0 ,;
13          cin  >>  n;
14           while (n)
15          {
16              cin  >>  l  >>  c;
17               for ( int  i  =   1 ; i  <=  n; i ++ )
18                  cin  >>  t[i];
19              
20               int  d[ 1001 ][ 1001 ];
21               for ( int  i  =   0 ; i  <=  n; i ++ )
22               for ( int  j  =   0 ; j  <=  n; j ++ )
23                  d[i][j]  =  INT_MAX;
24              
25              d[ 0 ][ 0 =   0 ;
26              
27               int  i;
28               for (i  =   0 ; i  <  n; i ++ )
29              {
30                   if (d[i][n]  !=  INT_MAX)
31                       break ;
32                  
33                   for ( int  j  =  i; j  <  n; j ++ )
34                  {
35                       if (d[i][j]  ==  INT_MAX)
36                           break ;
37                      
38                       int  x  =  l;
39                       for ( int  k  =  j  +   1 ; k  <=  n; k ++ )
40                      {
41                          x  -=  t[k];
42                           if (x  <   0 )
43                               break ;
44                          
45                           if (x  ==   0 )
46                              d[i  +   1 ][k]  <?=  d[i][j];
47                           else   if ( 1   <=  x  &&  x  <=   10 )
48                              d[i  +   1 ][k]  <?=  d[i][j]  -  c;
49                           else   if (x  >   10 )
50                              d[i  +   1 ][k]  <?=  d[i][j]  +  (x  -   10 *  (x  -   10 );
51                      }
52                  }
53              }
54              
55              cout  <<   " Case  "   <<   ++  Case  <<   ' : '   <<  endl  <<  endl;
56              cout  <<   " Minimum number of lectures:  "   <<  i  <<  endl;
57              cout  <<   " Total dissatisfaction index:  "   <<  d[i][n]  <<  endl;
58              
59              cin  >>  n;
60               if (n)
61                  cout  <<  endl;
62          }
63           if (N)
64              cout  <<  endl;
65      }
66      
67       return   0 ;
68  }
69 

你可能感兴趣的:(ZOJ 1183 - Scheduling Lectures)