数据太水
查看原帖
数据太水
556362
Unnamed114514楼主2022/1/13 13:43

数据太水了,这样写都能 A(不能 A 的地方放注释了):

#include<bits/stdc++.h>
using namespace std;
int n,m,a[20][20],p,q,bz=2e9,dp[20][20][20];
vector<int> q1;
inline int dd(int x,int y,int ls){
	if(x==q)
		return 0;
	if(dp[x][y][ls]!=-1)
		return dp[x][y][ls];
	if(!ls){
		for(int i=y;i<=m-(q-x)+1;++i){
			int ans=0;
			for(int j=1;j<p;++j)
				ans+=abs(a[q1[j]][i]-a[q1[j-1]][i]);
			if(dp[x][y][ls]==-1)
				dp[x][y][ls]=ans+dd(x+1,i+1,i);
			else
				dp[x][y][ls]=min(dp[x][y][ls],ans+dd(x+1,i+1,i));
			if(dp[x][y][ls]<=10)//
				return dp[x][y][ls];//
		}
	} else{
		for(int i=y;i<=m-(q-x)+1;++i){
			int ans=abs(a[q1[0]][i]-a[q1[0]][ls]);
			for(int j=1;j<p;++j)
				ans+=abs(a[q1[j]][i]-a[q1[j-1]][i])+abs(a[q1[j]][i]-a[q1[j]][ls]);
			if(dp[x][y][ls]==-1)
				dp[x][y][ls]=ans+dd(x+1,i+1,i);
			else
				dp[x][y][ls]=min(dp[x][y][ls],ans+dd(x+1,i+1,i));
			if(dp[x][y][ls]<=10)//
				return dp[x][y][ls];//
		}
	}
	return dp[x][y][ls];
}
inline void dfs(int x,int k){
	if(x){
		for(int i=k;i<=n-x+1;++i){
			q1.push_back(i);
			dfs(x-1,i+1);
			q1.pop_back();
		}
		return;
	}
	memset(dp,-1,sizeof(dp));
	bz=min(bz,dd(0,1,0));
}
inline char gc(){
    static char buf[1000000],*p1=buf,*p2=buf;
    return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;
}
inline int read(){
	int res=0;
	char ch=gc();
	while(ch<'0'||ch>'9')
		ch=gc();
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=gc();
	}
	return res;
}
int main(){
	n=read(),m=read(),p=read(),q=read();
	for(int i=1;i<=n;++i)
		for(int j=1;j<=m;++j)
			a[i][j]=read();
	dfs(p,1);
	printf("%d\n",bz);
	return 0;
}
2022/1/13 13:43
加载中...