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 }