题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5402

题意:现有一个n*m的迷宫(n行m列),每一个格子都有一个非负整数,Teacher Mai想要从迷宫的左上角(1,1)到迷宫的右下角(n,m),并且使得他走过的路径的整数之和最大,问最大和为多少以及他走的路径。

解法:

为什么要这么做?看论文:点击打开链接 这是棋盘染色的论文

知道这个结论之后,随便画一画就知道怎么构造了。


#include <bits/stdc++.h>
using namespace std;
int n,m,sum,x,y,a[102][102];

int main()
{
    while(~scanf("%d %d", &n,&m))
    {
        sum = 0;
        x = 1, y = 2;
        for(int i=1; i<=n; i++)
        for(int j=1; j<=m; j++){
            scanf("%d", &a[i][j]);
            sum += a[i][j];
            if((i+j)&1&&a[x][y]>a[i][j]){
                x=i;
                y=j;
            }
        }
        if(n&1||m&1){
            printf("%d\n", sum);
            if(n&1){
                for(int i=1; i<=n; i++){
                    for(int j=1; j<m; j++){
                        if(i&1) printf("R");
                        else printf("L");
                    }
                    if(i<n) printf("D");
                    else puts("");
                }
            }
            else{
                for(int i=1; i<=m; i++){
                    for(int j=1; j<n; j++){
                        if(i&1) printf("D");
                        else printf("U");
                    }
                    if(i<m) printf("R");
                    else puts("");
                }
            }
        }
        else{
            printf("%d\n", sum-a[x][y]);
            for(int i=1; i<=n; i+=2){
                if(x==i||x==i+1){
                    for(int j=1; j<y; j++){
                        if(j&1) printf("D");
                        else printf("U");
                        printf("R");
                    }
                    if(y<m) printf("R");
                    for(int j=y+1; j<=m; j++){
                        if(j&1) printf("U");
                        else printf("D");
                        if(j<m) printf("R");
                    }
                    if(i<n-1) printf("D");
                }
                else if(x<i){
                    for(int j=1; j<m; j++){
                        printf("L");
                    }
                    printf("D");
                    for(int j=1; j<m; j++){
                        printf("R");
                    }
                    if(i<n-1) printf("D");
                }
                else{
                    for(int j=1; j<m; j++){
                        printf("R");
                    }
                    printf("D");
                    for(int j=1; j<m; j++){
                        printf("L");
                    }
                    if(i<n-1) printf("D");
                }
            }
            puts("");
        }
    }
    return 0;
}