解题思路:思路见代码

注意事项:

参考代码:

#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.0分

1 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 0 条评论

暂无评论