65分求助
查看原帖
65分求助
1045301
Hamburger999楼主2024/10/11 20:59

WA on #5,#6,#12,#16-#19

#include<bits/stdc++.h>
using namespace std;

int A[20][20],f[20][20];
int ls[20][20],la[20],g[20];
int n,m,r,c,ans=0x7fffffff;

int DP(){
	memset(f,127,sizeof(f));
	for(int i=2;i<=n;i++){
		for(int j=1;j<i;j++){
			ls[i][j]=0;
			for(int k=1;k<=c;k++)
				ls[i][j]+=abs(A[i][g[k]]-A[j][g[k]]);
		}
	}
	for(int i=1;i<=n;i++){
		la[i]=0;
		for(int j=2;j<=c;j++)
			la[i]+=abs(A[i][g[j-1]]-A[i][g[j]]);
	}
	for(int i=1;i<=n;i++)
		for(int j=1;j<=min(i,r);j++){
			if(j==1)
				f[i][j]=la[i];
			else if(i==j)
				f[i][j]=f[i-1][j-1]+la[i]+ls[i][j-1];
			else
				for(int k=j-1;k<i;k++)
					f[i][j]=min(f[i][j],f[k][j-1]+la[i]+ls[i][k]);
		}
	int ret=0x7fffffff;
	for(int i=1;i<=n;i++)
		ret=min(ret,f[i][r]);
	return ret; 
}

void DFS(int n_,int m_){
	if(n_==n&&m_==c){
		ans=min(ans,DP());
	}
	if(n_<n){
		if(m_<c){
			g[m_+1]=n_+1;
			DFS(n_+1,m_+1);
			g[m_+1]=0;
		}
		DFS(n_+1,m_);
	}
}

int main(){
	cin>>n>>m>>r>>c;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			cin>>A[i][j];
	DFS(0,0);
	cout<<ans;
}
2024/10/11 20:59
加载中...