_xiaobai_

导航

zoj2972 Hurdles of 110m(DP)

/*
 背包类似物:
 关键是阶段的划分,昨天阶段想错了,其实阶段很明显了,今天调了一段时间,
 发现数据看错了,╮(╯▽╰)╭按照题目给出的阶段DP。
 转移方程 : F(i,j) = min( F(i-F1,j)+T1, F( i-1,j )+T2, F(i+F2,j)+T3 )
*/
View Code
 1 #include <iostream>
2 #include <cstdlib>
3
4 using namespace std;
5
6 int F[ 111 ][ 111 ];
7 int T1[ 111 ];
8 int T2[ 111 ];
9 int T3[ 111 ];
10 int F1[ 111 ];
11 int F2[ 111 ];
12 int dp( int N, int M )
13 {
14 for ( int i = 0 ; i <= N ; ++ i )
15 for ( int j = 0 ; j <= M ; ++ j )
16 F[ i ][ j ] = 0xffffff;
17
18 for ( int i = 0 ; i <= M ; ++ i )
19 F[ 0 ][ i ] = 0;
20
21 for ( int i = 1 ; i <= N ; ++ i ) {
22 /* 第一状态 */
23 for ( int j = F1[ i ] ; j <= M ; ++ j )
24 if ( j <= M && F[ i ][ j-F1[ i ] ] > F[ i-1 ][ j ] + T1[ i ] )
25 F[ i ][ j-F1[ i ] ] = F[ i-1 ][ j ] + T1[ i ];
26 /* 第二状态 */
27 for ( int j = 0 ; j <= M ; ++ j )
28 if ( F[ i ][ j ] > F[ i-1 ][ j ] + T2[ i ] )
29 F[ i ][ j ] = F[ i-1 ][ j ] + T2[ i ];
30 /* 第三状态 */
31 for ( int j = 0 ; j <= M ; ++ j )
32 if ( F[ i ][ min(j+F2[ i ],M) ] > F[ i-1 ][ j ] + T3[ i ] )
33 F[ i ][ min(j+F2[ i ],M) ] = F[ i-1 ][ j ] + T3[ i ];
34 }
35
36 int Min = 0xffffff;
37 for ( int i = 0 ; i <= M ; ++ i )
38 if ( Min > F[ N ][ i ] )
39 Min = F[ N ][ i ];
40 return Min;
41 }
42
43 int main()
44 {
45 int T,N,M;
46 while ( cin >> T )
47 while ( T -- ) {
48 cin >> N >> M;
49 for ( int i = 1 ; i <= N ; ++ i )
50 cin >> T1[ i ] >> T2[ i ] >> T3[ i ] >> F1[ i ] >> F2[ i ];
51 cout << dp( N, M ) << endl;
52 }
53 return 0;
54 }

posted on 2011-08-17 22:35  _xiaobai_  阅读(238)  评论(0编辑  收藏  举报