我希望你是我独家记忆

一段永远封存的记忆,随风而去
posts - 263, comments - 31, trackbacks - 0, articles - 3
   :: 首页 :: 新随笔 ::  :: 聚合  :: 管理

URAL1029

Posted on 2008-10-31 15:25 Hero 阅读(181) 评论(0)  编辑 收藏 引用 所属分类: 代码如诗--ACM
  1 // 1029 C++ Accepted 0.031 1 205 KB URAL
  2 
  3 //太假了--不想多说什么了
  4 
  5 #include <stdio.h>
  6 #include <stdlib.h>
  7 #include <string.h>
  8 
  9 const int INF = 1000000000 ;
 10 
 11 int data[110][550] ;
 12 int dp[110][550] ;
 13 
 14 struct PATH
 15 {
 16     int x ;
 17     int y ;
 18 };
 19 struct PATH path[110][550] ;
 20 struct PATH que[110*550] ;
 21 int head, tail ;
 22 
 23 int inn, inm ;
 24 
 25 void path_in_que( int floor, int posi )
 26 {
 27     if1 == floor )
 28     {
 29         que[++head].x = floor ; que[head].y = posi ;
 30     }
 31     else
 32     {
 33         path_in_que( path[floor][posi].x, path[floor][posi].y ) ;
 34         que[++head].x = floor ; que[head].y = posi ;
 35     }
 36 }
 37 
 38 int main()
 39 {
 40     scanf( "%d %d"&inn, &inm ) ;
 41     forint i=1; i<=inn; i++ )
 42     {
 43         forint j=1; j<=inm; j++ )
 44         {
 45             scanf( "%d"&data[i][j] ) ;
 46         }
 47     }//data input
 48 
 49     forint i=1; i<=inm; i++ )
 50     {
 51         dp[1][i] = data[1][i] ;
 52         path[1][i].x = 1 ; path[1][i].y = i ;
 53     }
 54     forint i=2; i<=inn; i++ )
 55     {
 56         forint j=1; j<=inm; j++ )
 57         {
 58             dp[i][j] = dp[i-1][j] + data[i][j] ;
 59             path[i][j].x = i-1 ; path[i][j].y = j ;
 60         }
 61         int cnt = 1 ;
 62         while( cnt != 0 )
 63         {
 64             cnt = 0 ;
 65             forint j=2; j<=inm; j++ )
 66             {
 67                 if( dp[i][j] > dp[i][j-1]+data[i][j] )
 68                 {
 69                     dp[i][j] = dp[i][j-1+ data[i][j] ;
 70                     path[i][j].x = i ; path[i][j].y = j-1 ;
 71                     cnt ++ ;
 72                 }
 73             }
 74             forint j=inm-1; j>=1; j-- )
 75             {
 76                 if( dp[i][j] > dp[i][j+1]+data[i][j] )
 77                 {
 78                     dp[i][j] = dp[i][j+1+ data[i][j] ;
 79                     path[i][j].x = i ; path[i][j].y = j+1 ;
 80                     cnt ++ ;
 81                 }
 82             }
 83         }
 84     }//dp
 85 
 86     int minval = INF ; int minposi ;
 87     forint i=1; i<=inm; i++ )
 88     {
 89         if( minval >= dp[inn][i] ) { minval = dp[inn][i] ; minposi = i ; }
 90     }
 91 
 92     head = tail = 0 ;
 93     //path_in_que( inn, minposi ) ;
 94 
 95     que[++head].x = inn, que[head].y = minposi ;
 96     int lastx = inn ;
 97     int lasty = minposi ;
 98     whiletrue )
 99     {
100         int tempx = lastx ; int tempy = lasty ;
101         if( lastx==path[tempx][tempy].x && lasty==path[tempx][tempy].y ) break ;
102         lastx = path[tempx][tempy].x ; lasty = path[tempx][tempy].y ;
103         que[++head].x = lastx ; que[head].y = lasty ;
104     }
105     for( tail=head; tail>=1; tail-- )
106     {
107         //if( que[tail].x == inn ) break ;
108         printf( "%d ", que[tail].y ) ;
109     }
110     printf( "\n" ) ;
111     //printf( "%d\n", que[tail].y ) ;
112 /*
113     char *blank = "" ; tail = 1 ;
114     for( tail=1; tail<=head; tail++ )
115     {
116         if( que[tail].x == inn ) break ;
117         printf( "%d ", que[tail].y ) ;
118     }
119     printf( "%d\n", que[tail].y ) ;
120 */
121     return 0 ;
122 }

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理