CCPC Wannafly Winter Camp Day7 G 草莓2

思路:当K小于n*m的时候,直接暴力

    当K>=n*m的时候,先跑一遍哈密顿回路,然后剩下的天数,按第一次走哈密顿回路的顺序继续走即可

代码如下:

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define ll long long
 6 ll input(){
 7     ll x=0,f=0;char ch=getchar();
 8     while(ch<'0'||ch>'9') f|=ch=='-',ch=getchar();
 9     while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
10     return f? -x:x;
11 }
12 
13 ll n,m,x,y,k;
14 ll a[15][15];
15 ll vis[15][15];
16 
17 ll dfs(ll dep,ll tx,ll ty){
18     if(dep>=k) return 0;
19     if(tx<1||tx>n||ty<1||ty>m) return 0;
20     ll res=0,t=vis[tx][ty];
21     vis[tx][ty]=-(a[tx][ty]+dep);
22     res=max(dfs(dep+1,tx+1,ty),res);
23     res=max(dfs(dep+1,tx-1,ty),res);
24     res=max(dfs(dep+1,tx,ty+1),res);
25     res=max(dfs(dep+1,tx,ty-1),res);
26     
27     vis[tx][ty]=t;
28     
29     res+=a[tx][ty]+vis[tx][ty]+dep;
30 
31     return res;
32 }
33 
34 int main(){
35     n=input(),m=input();
36     x=input(),y=input();
37     k=input();
38 
39     ll sum=0,Ans=0;
40 
41     for(int i=1;i<=n;i++){
42         for(int j=1;j<=m;j++){
43             a[i][j]=input();
44             vis[i][j]=0;
45             sum+=a[i][j];
46         }
47     }
48 
49     if(k<n*m){
50         Ans=dfs(0,x,y);
51     }else{
52         //int tmp1=((n*m-1)*n*m)/2;   //这一部分是走一遍哈密顿回路的收获的值,1,2,3,4,,,,n-1
53         //int tmp2=(k-(n*m))*(n*m);     //这一部分是走剩下的点的值,按第一遍走的顺序走,每一个点的权值
54             //都是n*m
55         Ans=sum+((n*m-1)*n*m)/2+(k-(n*m))*(n*m);
56     }
57     printf("%lld\n",Ans);
58 }

 

posted @ 2020-09-03 23:54  古比  阅读(134)  评论(0编辑  收藏  举报