解题思路:思路见代码
注意事项:
参考代码:
#include<cstdio>
#include<algorithm>
using namespace std;
struct point
{
int x,y,data;//记录每个点的位置和数值
}p[100];
int n,m,map[11][11],f[11][11];
int main() {
int i,ii,j,jj,l;
scanf("%d",&n);
while(1)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
if(!a&&!b&&!c)break;
p[++m].x=a;
p[m].y=b;
p[m].data=c;
}
for(i=1;i<=m;i++)
map[p[i].x][p[i].y]=p[i].data;
for(l=2;l<=n*2;l++)//每个点最少横着竖着都走一格,最多都走n格就到终点
for(i=l-1;i>=1;i--)//和前面说的一样,倒着做
for(ii=l-1;ii>=1;ii--)
{
j=l-i;jj=l-ii;//i+j=ii+jj=l
f[i][ii]=max(max(f[i][ii],f[i-1][ii-1]),max(f[i-1][ii],f[i][ii-1]))+map[i][j];
//重点说明一下吧,这里省略了很多。如果i不减1,意思就是j-1,因为上一个阶段就是l-1嘛。如果ii-1,意思就是说jj不减1。
f[i][ii]+=map[ii][jj]*(i!=ii); //如果i==ii,其实就是(i==ii&&j==jj),因为和都是l嘛。如果走过一遍,第二遍走得到的值就是0(题目上说的)。
}
printf("%d\n",f[n][n]); //输出意思是在路径长度为2*n的阶段,两遍都走到(n,n)的最优值。因为在这里(j=2*n-i=n,jj=2*n-ii=n),所以走到的就是(n,n)的位置 return 0;
}
0.0分
2 人评分
C语言训练-阶乘和数* (C语言代码)浏览:1060 |
数列 (C++代码)浏览:707 |
2005年春浙江省计算机等级考试二级C 编程题(3),复杂度最低的方法没有之一!!!!!浏览:856 |
弟弟的作业 (C++代码)浏览:1342 |
C语言程序设计教程(第三版)课后习题5.6 (C语言代码)浏览:563 |
printf基础练习2 (C语言代码)浏览:826 |
WU-链表数据求和操作 (C++代码)浏览:1382 |
Hello, world! (C++代码)浏览:1778 |
C语言程序设计教程(第三版)课后习题8.8 (C语言代码)浏览:583 |
K-进制数 (C语言描述,蓝桥杯)浏览:955 |