poj 1695 dp(三辆汽车运送杂志)

题意:给定n个城市,用1~n表示。有3辆车,开始都在点1上,要用这些车把杂志运送到各个城市里,当一个车在转移时,其他两辆车静止,并且两辆车不能跑到同一个位置,分配还得遵循递增的顺序,即城市i有了杂志后,车才能开到i+1城市送杂志。要求所有城市都送到杂志,汽车做过的路程和花费最小。

思路:动态规划。dp[i][j][k]分别表示3辆车所在城市i,j,k时所花费的最小时间。因为城市要按照城市标号递增的顺序送,所以可以反过来求,dp[i][j][k+1]表示dp[i][j][k]状态,k位置的车开到了k+1位置,其他同理。dp[i][j][k] = min(dp[i][j][k+1] + dist[k][k+1], dp[j][k][k+1] + dist[i][k+1], dp[i][k][k+1] + dist[j][k+1]); 1<=i,j <=k。动归思路比较惊艳

参考(http://blog.csdn.net/xiaoxiaoluo/article/details/7392378)

#include <stdio.h>
#include <string.h>
#define min(a,b) ((a)<(b)?(a):(b))
#define N 35
int dp[N][N][N],dis[N][N];
int n,T;
int main(){
    scanf("%d",&T);
    while(T--){
        int i,j,k;
        memset(dp, 0, sizeof(dp));
        memset(dis, 0, sizeof(dis));
        scanf("%d",&n);
        for(i = 1;i<n;i++)
            for(j = i+1;j<=n;j++)
                scanf("%d",&dis[i][j]);
        for(k = n-1;k>=1;k--)
            for(i = 1;i<=n;i++)
                for(j = 1;j<=n;j++)
                    dp[i][j][k] = min(dp[i][j][k+1]+dis[k][k+1] , min(dp[i][k][k+1]+dis[j][k+1],dp[j][k][k+1]+dis[i][k+1]));
        printf("%d\n",dp[1][1][1]);
    }
    return 0;
}


你可能感兴趣的:(poj 1695 dp(三辆汽车运送杂志))