zoj 1428 Magazine Delivery (DP)

今天练习赛的题目,我先读的,以为是图论,叫XSY去看,结果越弄越理不清头绪。。最后没办法只能放弃。
下午结束后才知道原来是道DP。以三辆车的位置为状态,j,k为不动的车位置,i为当前移动车的位置。dp[j,k,i]可由dp[j,k,i+1],dp[j,i,i+1],dp[k,i,i+1]移动一次达到。

另外长了个记性,以后绝对不再使用宏定义了,宏定义的取最值方法老是出错,找不出来原因。

code:

#include<cstdio>
#include<cstring>
#include<algorithm>
using  namespace std ;
int data[ 31][ 31] ;
int dp[ 31][ 31][ 31] ;
int main(){
     int t, n, i, j, k ;
    scanf( " %d ", &t) ;
     while(t--){
        memset(dp,  0sizeof(dp)) ;
        scanf( " %d ", &n) ;
         for(i= 1; i<n; i++)
             for(j=i+ 1; j<=n; j++)
                scanf( " %d ", &data[i][j]) ;
         for(i=n- 1; i>= 1; i--)
             for(j= 1; j<=i; j++)
                 for(k= 1; k<=i; k++){
                    dp[j][k][i] = min(dp[j][k][i+ 1]+data[i][i+ 1], dp[k][i][i+ 1]+data[j][i+ 1]) ;
                    dp[j][k][i] = min(dp[j][k][i], dp[j][i][i+ 1]+data[k][i+ 1]) ;
                }
        printf( " %d\n ", dp[ 1][ 1][ 1]) ;
    }
     return  0 ;} 

转载于:https://www.cnblogs.com/xiaolongchase/archive/2012/04/11/2443142.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值