题解 P2940 【[USACO09FEB]音乐妖精The Leprechaun】

· · 题解

话说这一题这么水,怎么只有二十几人通过呢
题干字很多,够我凑一篇英语作文了,内容也十分有(zhi)趣(zhang),其实大意就是在一个矩阵中,找一个和最大的子串,不过这个子串可以从一边到达另一边,且可以走对角线。
思路很简单,就是枚举所有点,然后往右,下,右下,右上暴搜(题目说的很清楚1<=N<=200,不会超时),输出最大值。

接下来就是各位期待的东西了:

#include<bits/stdc++.h>
using namespace std;
int n,a[201][201],maxx=-10000000,i,j,k,w,x,y,z;  //maxx要足够小 
int main()
{
    cin>>n;
    for(i=0;i<n;i++)
    for(j=0;j<n;j++)
    cin>>a[i][j];                      //输入,不解释 
    for(i=0;i<n;i++)
    for(j=0;j<n;j++,w=0,x=0,y=0,z=0)   //枚举所有点,注意w,x,y,z要清零 
    for(k=0;k<n;k++)
    {
        w+=a[i][(j+k)%n];              //下 
        x+=a[(i+k)%n][j];              //右 
        y+=a[(i+k)%n][(j+k)%n];        //右下 
        z+=a[(i-k+n)%n][(j+k)%n];      //右上 
        maxx=max(max(max(w,x),max(y,z)),maxx);  //比较大小 
    }
    cout<<maxx;                        //输出 
}

本人蒟蒻,不过代码也算易懂。如果代码有不善之处,或存在废话,拒绝欢迎各位大犇指正