题解 洛谷P1004 【方格取数】

洛谷版链接:https://www.luogu.com.cn/blog/jvruo-0076/solutiun-p1004
这个题其实吧,说简单也不简单对于我来说,说难也不难对您来说
其实,这个题就是让你去找最值。也就是
~~~
f[i][j][l][k] = max(max(f[i - 1][j][l - 1][k], f[i][j - 1][l][k-1]), max(f[i - 1][j][l][k - 1], f[i][j - 1][l - 1][k])) + d[i][j];
~~~
这是一个后面处理的问题,前面该怎么办呢?
~~~
while(cin>>x>>y>>s && x)
d[x][y] = s;
~~~
这里就有人看不懂了包括我,什么叫while(cin>>x>>y>>s && x)呢?
就是这样的:
这里结合了输入,判断,循环。意思是,输入x,y,s,判断x是否不为0,如果是,进行循环。这就等价于
~~~
a123:
cin>>x>>y>>s;
if(x!=0)//或者if(x)
{
...//(此处省略)
goto a123;
}
~~~
什么?a123,goto a123;又是啥?
这样的:
设置一个由字母,数字构成的名称(如a123,kkksc03,zhentanshu666),用goto在加这个名称,就会跳到这个名称后面的那部分程序。

注意:不太建议试用a123,goto a123;这类程序,避免出现一些问题

例如:评测机的缺陷导致编译错误,或跳出不该跳出的循环。在一些评测网站上,这类字眼会被当做“不合法的指针飘移”

好了,扯远了...
最后输出,完美结束。

Code

#include<bits/stdc++.h>
using namespace std;
int n, i, j, l, k, x, y, s;
int d[55][55], f[55][55][55][55];
int main() 
{
 cin>>n;
 while(cin>>x>>y>>s && x)
 d[x][y] = s;
 for(i = 1; i <= n; i++)
 for(j = 1; j <= n; j++)
 for(l = 1; l <= n; l++)
 for(k = 1; k <= n; k++) 
 {
  f[i][j][l][k] = max(max(f[i - 1][j][l - 1][k], f[i][j - 1][l][k-1]), max(f[i - 1][j][l][k - 1], f[i][j - 1][l - 1][k])) + d[i][j];
  if(i != 1 && j != k) f[i][j][l][k] += d[l][k];
  }
 printf("%d", f[n][n][n][n]);
 return 0;
}

最后在说上一句:
希望您点赞,关注我!
Good bye!

猜你喜欢

转载自www.cnblogs.com/107003CN171yunbingche/p/12040490.html