| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 886 人关注过本帖
标题:Gondar哪位来看看问题出在哪里?
取消只看楼主 加入收藏
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
 问题点数:0 回复次数:2 
Gondar哪位来看看问题出在哪里?
Time Limit:1000MS Memory Limit:65536K
Total Submit:0 Accepted:0

Description

Gardon和Gondar上学去的路上,发现地上遍地都是鲜美的蘑菇!Gardon和Gondar在(0,0)位置,他们要去(m-1,n-1)的位置去上学,由于已经快上课了,所以他们必须走最短的路过去,但是地上的蘑菇又实在太诱人了,所以他们决定分头去采。他们每次可以向下或者向右走一格,走到一格的时候就采光那里所有的蘑菇;如果他们中间的时候走到一起,该地点上蘑菇也只能被采一次;直到走到教室为止。你能计算下按照这样的规则,他们加在一起最多能采到多少蘑菇么?

Input

输入包含多组数据,数据的第一行有两个整数,m和n。接下来的m行每行有n个整数,表示了每个地点蘑菇的数目。已知起点(0,0)和终点(m-1,n-1)都一定没有蘑菇。所有的整数都是非负数且都不超过100。
输入以两个0作为结束。

Output

对于输入的每组数据,输出一个整数,为Gardon和Gondar所能采到的最多的蘑菇数目。

Sample Input


4 4
0 1 1 0
1 0 1 1
0 1 1 0
1 0 1 0
0 0

Sample Output


8

Hint

1 1 1 0
0 0 1 1
0 0 0 1
0 0 0 1

2 0 0 0
2 0 0 0
2 2 2 0
0 0 2 0

这两个表表示Gardon和Gondar要走的路线。

[[it] 本帖最后由 心剑菩提 于 2008-8-21 15:21 编辑 [/it]]
搜索更多相关主题的帖子: 蘑菇 Gondar 
2008-08-20 08:10
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
得分:0 
恩,知道DP,但状态方程?

[[it] 本帖最后由 心剑菩提 于 2008-8-21 13:26 编辑 [/it]]

前世五百次的回眸 才换来今生的擦肩而过
2008-08-20 20:17
心剑菩提
Rank: 1
等 级:新手上路
帖 子:249
专家分:0
注 册:2007-5-17
收藏
得分:0 
哪位来看看问题在哪里?
#include"stdio.h"
#include"string.h"
#define max(x,y) (x>y?x:y)
int main()
{
    int i,j;
    int n,m;
    int map[100][100];
    int ans[100][100];
    while(scanf("%d%d",&m,&n)&&n&&m)
    {
        memset(map,0,sizeof(map));
        for(i=0;i<m;i++)
            for(j=0;j<n;j++)  scanf("%d",&map[i][j]);
        memset(ans,0,sizeof(ans));
        for(i=0;i<m;i++)
            for(j=i+1;j<n;j++)
            {
                if(i==0)    ans[i][j]=ans[i][j-1]+map[i][j];//上边线问题(只能是由左继承)
                else
                {
                  if(j-i==1)ans[i][j]=ans[i-1][j]+map[i][j];//中对角线的边线问题(只能上继承)  
                  else        ans[i][j]=max(ans[i-1][j],ans[i][j-1])+map[i][j];//(转移动态方程)         
                }
            }            
        for(i=1;i<m; i++)
            for(j=0;j<=i;j++)
            {
                if(j==0) ans[i][j]=ans[i-1][j]+map[i][j];//左边界问题(只由上继承)
                else           
                {
                    if(j==i)   ans[i][j]=ans[i][j-1]+map[i][j];//中对角线的边界问题(只能左继承)
                    else       ans[i][j]=max(ans[i-1][j],ans[i][j-1])+map[i][j];//(转移动态方程)
                }
            }
            printf("\n");
        /*for(i=0;i<m;i++)
        {
             for(j=0;j<n;j++)
                 printf("%d  ",ans[i][j]);
             printf("\n");
        }*/
        printf("%d\n",ans[m-2][n-1]+ans[m-1][n-2]);//二路合并。
    }
    return 0;
}

前世五百次的回眸 才换来今生的擦肩而过
2008-08-21 13:28
快速回复:Gondar哪位来看看问题出在哪里?
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024154 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved