infinity

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  36 随笔 :: 0 文章 :: 25 评论 :: 0 Trackbacks

这个题我参考了别人的解题报告,题目很容易让人产生误解,其实不用去求最短路,求了反而不对,
直接用输入中所给的两点间的距离就行了。方法是三维DP。f[a][b][c]表示当前离起点最远的车处在
c位置,另外两车分别处在a,b位置时的所需要的最少的投递时间。那么下一个状态只有三种可能,即
f[a][b][c+1],即c车到了c+1处
f[a][c][c+1],即b车到了c+1处
f[b][c][c+1],即a车到了c+1处
当c==(目标点时) 结束。
采取记忆化搜索的方式。

Source Code

Problem: 1695 User: lovecanon
Memory: 324K Time: 0MS
Language: C Result: Accepted
  • Source Code
    
        
    #include<stdio.h>
        #include
    <string.h>
        
    int map[31][31];
        
    int ans[31][31][31];
        
    int n;
        
    int GetMin(int a,int b,int c)
        {
        
    int tmp=a<=b?a:b;
        tmp
    =tmp<=c?tmp:c;
        
    return tmp;
        }
        
    int solve(int a,int b,int c)
        {
        
    if(c==n) return 0;
        
    if(ans[a][b][c+1]==0)  ans[a][b][c+1]=solve(a,b,c+1);
        
    if(ans[a][c][c+1]==0)  ans[a][c][c+1]=solve(a,c,c+1);
        
    if(ans[b][c][c+1]==0)  ans[b][c][c+1]=solve(b,c,c+1);
        
    return GetMin(ans[a][b][c+1]+map[c][c+1],ans[a][c][c+1]+map[b][c+1],ans[b][c][c+1]+map[a][c+1]);
        }
        
    int main()
        {
        
    int cases;
        scanf(
    "%d",&cases);
        
    while(cases--)
        {
        
    int i;
        scanf(
    "%d",&n);
        memset(ans,
    0,sizeof(ans));
        
    for(i=1;i<=n-1;i++)
        {
        
    int j;
        
    for(j=i+1;j<=n;j++)
        {
        scanf(
    "%d",&map[i][j]);
        map[j][i]
    =map[i][j];
        }
        }
        printf(
    "%d\n",solve(1,1,1));
        }
        
    return 0;
        }

posted on 2008-09-20 04:02 infinity 阅读(362) 评论(0)  编辑 收藏 引用 所属分类: acm

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