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;
}
#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;
}