PKU 1260 Pearls

PKU 1260 Pearls

问题:
http://acm.pku.edu.cn/JudgeOnline/problem?id=1260

思路:
简单DP,但是就是想不到...

代码:
 1  #include < stdio.h >
 2  #include < stdlib.h >
 3  #include < string .h >
 4  #define  MAX_LEN 101
 5  #define  INF 0x7FFFFFFF
 6  #define  min(a,b) ((a)<(b) ? (a) : (b))
 7  int  num[MAX_LEN], price[MAX_LEN];
 8  int  sum[MAX_LEN];  /*  aux  */
 9  int  table[MAX_LEN];
10  int  c;
11 
12  /*
13   * f[i] represent the lowest possible price needed to buy list[1..i], so:
14   *      f[i] = min (f[k] + (num[k+1]++num[i]+10)*price[i]), 0<=k<i-1
15    */
16  int
17  dp()
18  {
19       int  i, k, tmp;
20      sum[ 0 =   0 ;
21       for (i = 1 ; i <= c; i ++ )
22          sum[i]  =  sum[i - 1 ] + num[i];
23      table[ 0 =   0 ;
24       for (i = 1 ; i <= c; i ++ ) {
25          table[i]  =  INF;
26           for (k = 0 ; k <= i - 1 ; k ++ ) {
27              tmp  =  table[k]  +  (sum[i] - sum[k] + 10 ) * price[i];
28              table[i]  =  min(table[i], tmp);
29          }
30      }
31       return  table[c];
32  }
33 
34  int
35  main( int  argc,  char   ** argv)
36  {
37       int  i, tests;
38      scanf( " %d " & tests);
39       while (tests -- ) {
40          scanf( " %d " & c);
41           for (i = 1 ; i <= c; i ++ )
42              scanf( " %d %d " , num + i, price + i);
43          printf( " %d\n " , dp());
44      }
45  }

你可能感兴趣的:(PKU 1260 Pearls)