ACM PKU 1695 Magazine Delivery 三维动态规划

http://acm.pku.edu.cn/JudgeOnline/problem?id=1695
第一次做三位动态规划,看了谢迪的《浅谈动态规划》,写出如下程序

#include "stdio.h"

int f[33][33][33];
int d[33][33];
int maxint=99999;

void main()
{
    
int T,i,j,k,n,opt;
    scanf(
"%d",&T);
    
while(T--)
    
{
        scanf(
"%d",&n);
        
for(i=1;i<=n-1;i++//读数据
            for(j=i+1;j<=n;j++)
            
{
                scanf(
"%d",&d[i][j]);
                d[j][i]
=d[i][j];
            
            }


        
for(i=1;i<=n;i++)//初始化
            for(j=1;j<=n;j++)
                
for(k=1;k<=n;k++)
                    f[i][j][k]
=maxint;
        
         f[
1][1][1]=0;

         
for(k=2;k<=n;k++)
             
for(i=1;i<k;i++)
                 
for(j=1;j<k;j++)
                     
if(f[i][j][k-1]!=maxint)
                     
{
                         
if(f[i][j][k-1]+d[i][k]<f[j][k-1][k])
                          f[j][k
-1][k]=f[i][j][k-1]+d[i][k];

                         
if(f[i][j][k-1]+d[j][k]<f[i][k-1][k])
                          f[i][k
-1][k]=f[i][j][k-1]+d[j][k];
                         
                         
if(f[i][j][k-1]+d[k-1][k]<f[i][k-1][k])
                         f[i][j][k]
=f[i][j][k-1]+d[k-1][k];
                     }


         opt
=f[1][1][n];
         
for(i=1;i<n;i++)
             
for(j=1;j<n;j++)
                 
if(f[i][j][n]<opt)opt=f[i][j][n];
         printf(
"%d\n",opt);



         
          



    }

}

本地调试成功,不过提交上去总是wa,郁闷了我一个多小时了.
唉..
不过总算是自己做了一次三维动态规划了.希望哪个牛人可以告诉我这个程序哪里出问题了.

posted on 2007-11-08 01:35 流牛ζ木马 阅读(1008) 评论(5)  编辑 收藏 引用

评论

# re: ACM PKU 1695 Magazine Delivery 三维动态规划 2007-11-10 21:19 Run&Run

能把状态转移方程写一下吗?  回复  更多评论   

# re: ACM PKU 1695 Magazine Delivery 三维动态规划 2007-11-10 23:39 流牛ζ木马

假设i,j<k
f[i][j][k-1]表示状态: 三个车分别在i,j,k-1的位置

状态转移有三个,要么是从某车i开到k ,要么是j开到k,要么是k-1开到k(递推方式,每次加1)

所以状态转移方程是:
f[i][j][k-1]+d[i][k] -> f[j][k-1][k]
f[i][j][k-1]+d[j][k] -> f[i][k-1][k]
f[i][j][k-1]+d[k-1][k] -> f[i][k-1][k]

这是3维动态规划的基本模型
唉,不知道怎么过不去啊~
你要是有兴趣就帮忙测试一下吧~ 呵呵
  回复  更多评论   

# re: ACM PKU 1695 Magazine Delivery 三维动态规划 2007-11-11 12:32 Run&Run

你第三个if语句错了,
if(f[i][j][k-1]+d[k-1][k]<f[i][k-1][k])
f[i][j][k]=f[i][j][k-1]+d[k-1][k];
应该是
if(f[i][j][k-1]+d[k-1][k]<f[i][j][k])
f[i][j][j]=f[i][j][k-1]+d[k-1][k];

还有就是你三个if语句都只写了一半.只要细想一下就会发现
f[i][j][k]其实应该是等于f[j][i][k]的,
所以每个if语句中都要再加上一条赋值语句.
我帮你改了下,AC了.修改如下.

f[1][1][1]=0;
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=1;j<k;j++)
{
if(f[i][j][k-1]+d[i][k]<f[j][k-1][k])
{
f[j][k-1][k]=f[i][j][k-1]+d[i][k];
f[k-1][j][k]=f[i][j][k-1]+d[i][k];
}
if(f[i][j][k-1]+d[j][k]<f[i][k-1][k])
{
f[i][k-1][k]=f[i][j][k-1]+d[j][k];
f[k-1][i][k]=f[i][j][k-1]+d[j][k];
}
if(f[i][j][k-1]+d[k-1][k]<f[i][j][k])
{ f[i][j][k]=f[i][j][k-1]+d[k-1][k]; f[j][i][k]=f[i][j][k-1]+d[k-1][k];
}
}

  回复  更多评论   

# re: ACM PKU 1695 Magazine Delivery 三维动态规划 2007-11-11 19:24 流牛ζ木马

呵呵!感谢! 原来是这么细微的问题! 晕哦

谢谢哈

另外,你说的第二个问题是不存在的,我也考虑到你说的问题;因为你仍然用的
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=1;j<k;j++)
仍然是完全穷举
时间效率上没有任何改进,反而因为重复计算降低了效率。
其实可以这样改,会提高一点点效率:
for(k=2;k<=n;k++)
for(i=1;i<k;i++)
for(j=i;i<k;j++)

  回复  更多评论   

# re: ACM PKU 1695 Magazine Delivery 三维动态规划 2008-04-26 14:06 DeathKnight

这个虽然ac 但是还不对
应该需要先算一遍任意两点间的最短距离

考虑下面这种情况:
从(1,2,3)-》(1,3,4)
那么从2开到4可以走的最短路并不一定是从2直接到4,你可以从2-》3-》4

给你一个例子:
1
4
2 5 6
2 2
8

你的算出来是9 但其实应该是8

所以要么先算一遍最短路 要么把状态考虑全 比如要算(1,2,2)这种状态  回复  更多评论   


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


<2009年8月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

公告

MY Email/MSN :mars1021@163.com QQ : 27402040 流牛ζ木马

常用链接

留言簿(6)

随笔档案

相册

搜索

最新随笔

最新评论

阅读排行榜

评论排行榜