题解 P1004 【方格取数】

Maxrage

2019-11-09 10:56:18

Solution

这个题其实吧,说简单也不简单~~对于我来说~~,说难也不难~~对您来说~~。 其实,这个题就是让你去找最值。也就是 ~~~ 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 ```cpp #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!