给出一张图,每个点上都有一个非负的数值;
要求从左上角走到右下角,走过的点不能再走,得到的最大数值是多少,并输出路线;(转)
http://acm.hdu.edu.cn/showproblem.php?pid=5402详细题解:http://www.cnblogs.com/AOQNRMGYXLMV/p/4743293.html
http://blog.csdn.net/yeyeyeguoguo/article/details/47802645
#include<bits/stdc++.h>
using namespace std;
int str[110][110];
int main()
{
// freopen("1.txt","w",stdout);
int n,m;
while(~scanf("%d%d",&n,&m))
{
int minn = 11000;
int x,y,sum = 0;
for(int i = 1;i <= n;i++)
{
for(int j = 1;j <= m;j++)
{
scanf("%d",&str[i][j]);
sum += str[i][j];
if((i+j) % 2 == 1 && str[i][j] < minn)
{
minn = str[i][j];
x=i,y=j;
}
}
}
if((n & 1) && (m & 1))
{
printf("%d\n",sum);
for(int i = 1;i <= n;++i)
{
if(i & 1)
for(int j = 2;j <= m;++j)
printf("R");
else
for(int j = 2;j <= m;++j)
printf("L");
if(i != n)
printf("D");
}
printf("\n");
continue;
}
if((n & 1) && !(m & 1))
{
printf("%d\n",sum);
for(int i = 1;i <= n;++i)
{
if(i & 1)
for(int j = 2;j <= m;++j)
printf("R");
else
for(int j = 2;j <= m;++j)
printf("L");
if(i != n)
printf("D");
}
printf("\n");
continue;
}
if(!(n & 1) && (m & 1))
{
printf("%d\n",sum);
for(int i = 1;i <= m;++i)
{
if(i & 1)
for(int j = 2;j <= n;++j)
printf("D");
else
for(int j = 2;j <= n;++j)
printf("U");
if(i != m)
printf("R");
}
printf("\n");
continue;
}
if(!(n & 1) && !(m & 1))
{
printf("%d\n",sum-str[x][y]);
if(x & 1||y==1) //拐来拐去限制在y-1列和y列,所以y=1要特殊处理
{
for( int i=1;i<=y-2;++i)
{
for(int j = 2;j <= n;++j){
if(i & 1)
printf("D");
else
printf("U");
}
printf("R");
}
// 此时已经进入拐来拐去区域
int p=0,u=0; //u用来判断最后的位置是在拐来拐去那两列的左列还是右列,是左列的话还要输出一个R
for(int i=1;i<=n-1;++i){
if(x != i){
if(p==0){ //p用来判断有没有经历过那个点,有的话一切相反
if(i & 1){
printf("RD");
u=1;
}
else{
printf("LD");
u=0;
}
}
else{
if(i & 1){
printf("LD");
u=0;
}
else{
printf("RD");
u=1;
}
}
}
else{
printf("D"); //跳过这一行
p=1;
}
}
if(u==0)
printf("R");
if(y==1)
y=2; //y=1相当于y=2的情况
if( y != m){ //还要判断拐来拐去结束后还有没有盘旋的区域,此时还没有进入
printf("R"); //进入盘旋区域
for(int i=y+1;i<=m;++i){
for(int j=2;j<=n;++j){
if(i & 1)
printf("U");
else
printf("D");
}
if(i!=m)
printf("R");
}
}
}
else
{
for( int i=1;i<=y-2;++i)
{
for(int j = 2;j <= n;++j){
if(i & 1)
printf("D");
else
printf("U");
}
printf("R");
}
// cout<<"//";
int p=0,u=0;
for(int i=n;i>=2;--i){
if(x != i){
if(p==1){
if(i & 1){
printf("RU");
u=1;
}
else{
printf("LU");
u=0;
}
}
else{
if(i & 1){
printf("LU");
u=0;
}
else{
printf("RU");
u=1;
}
}
}
else{
printf("U");
p=1;
}
}
if(u==0)
printf("R");
// cout<<"//";
if( y != m){
printf("R");
for(int i=y+1;i<=m;++i)
{
for(int j=2;j<=n;++j){
if(i & 1)
printf("U");
else
printf("D");
}
if(i != m)
printf("R");
}
}
}
printf("\n");
}
}
return 0;
}