fjnu 1362 收集样本问题

Description

问题描述:
机器人Rob在一个有n*n 个方格的方形区域F 中收集样本。(i,j)方格中样本的价值为v(i,j),如下图所示。


Rob 从方形区域F 的左上角A点出发,向下或向右行走,直到右下角的B 点,在走过的路上,收集方格中的样本。Rob 从A点到B 点共走2次,试找出Rob 的2条行走路径,使其取得的样本总价值最大。
编程任务:
给定方形区域F 中的样本分布,编程计算Rob 的2条行走路径,使其取得的样本总价值最大。

Input

输入数据:
第1 行有1 个正整数n,表示方形区域F有n*n 个方格。接下来每行有3 个整数,前2 个表示方格位置,第3个数为该位置样本价值。最后一行是3个0。

Output

将计算的最大样本总价值输出。

Sample Input

8
2 3 13
2 6 6
3 5 7
4 4 14
5 2 21
5 6 4
6 3 15
7 2 14
0 0 0

Sample Output

67

 KEY:我开始以为是搜索题,看了好久,感觉不好搜……后来发现居然是DP;

 

Source:

#include
< iostream >
using   namespace  std;

int  a[ 101 ][ 101 ];
int  h[ 101 ][ 101 ][ 101 ][ 101 ];
int  n;

int  max( int  a, int  b)
{
    
if(a>b) return a;
    
else return b;
}


void  fun( int  x1, int  y1, int  x2, int  y2, int  t)
{
    
if(x1==x2&&y1==y2)
    
{
        h[x1][y1][x2][y2]
=max(h[x1][y1][x2][y2],t+a[x1][y1]);
    }

    
else
    
{
        h[x1][y1][x2][y2]
=max(h[x1][y1][x2][y2],t+a[x1][y1]+a[x2][y2]);
    }

}


void  GetList()
{
    
int x1,y1,x2,y2;
    h[
1][1][1][1]=a[1][1];
    
int s;
    
for(s=2;s<=2*n-1;s++)
        
for(x1=1;x1<=s-1;x1++)
            
for(x2=1;x2<=s-1;x2++)
            
{
                y1
=s-x1;
                y2
=s-x2;
                
int t=h[x1][y1][x2][y2];
                fun(x1
+1,y1,x2+1,y2,t);
                fun(x1
+1,y1,x2,y2+1,t);
                fun(x1,y1
+1,x2+1,y2,t);
                fun(x1,y1
+1,x2,y2+1,t);
            }

}


int  main()
{
//    freopen("fjnu_1362.in","r",stdin);
    cin>>n;
    
int x,y,v;
    
while(cin>>x>>y>>v&&(x||y||v))
    
{
        a[x][y]
=v;
    }

    GetList();
    cout
<<h[n][n][n][n]<<endl;
    
return 0;
}


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值