为防止广告,目前nocow只有登录用户能够创建新页面。如要创建页面请先登录/注册(新用户需要等待1个小时才能正常使用该功能)。

Sgu/167

来自NOCOW
< Sgu
跳转到: 导航, 搜索
/by Logic
#include<stdio.h>
#include<string.h>
const int maxn=17;
int n,m,k,te[maxn][maxn]={0},ans=-1,la=0;
int oc[maxn][3],lin=0;
int f[maxn][maxn][maxn][maxn*maxn][4]={0};
int fr[maxn][maxn][maxn][maxn*maxn][4]={0};
int ch[4][5]={{4,0,1,2,3},{2,1,3},{2,2,3},{1,3}};
inline int max(int xx,int yy) {return xx>yy?xx:yy;}
inline int hash(int i,int l,int r,int t,int j) {return j*3200000+t*8000+i*400+l*20+r;}
void get(int l,int r,int st,int &lowl,int &higl,int &lowr,int &higr)
{
	switch(st)
	{
		case 0: lowl=1,higl=l,lowr=r,higr=m;
				break;
		case 1: lowl=l,higl=r,lowr=r,higr=m;
				break;
		case 2: lowl=1,higl=l,lowr=l,higr=r;
				break;
		case 3: lowl=l,higl=m,lowr=1,higr=r;
				break;
	}
}
int main()
{
#ifndef ONLINE_JUDGE
	freopen("data.in","r",stdin);
#endif
	int i,j,l,r,t,d,l0,r0;
	scanf("%d%d%d",&n,&m,&k);
	for(i=1;i<=n;i++)
		for(j=1;j<=m;j++)
		{
			scanf("%d",&te[i][j]);
			te[i][j]+=te[i][j-1];
		}
	memset(f,-1,sizeof(f));
	for(i=1;i<=n;i++)
		for(l=1;l<=m;l++)
			for(r=l;r<=m;r++)
				f[i][l][r][r-l+1][0]=te[i][r]-te[i][l-1];
	for(i=1;i<=n;i++)
		for(l=1;l<=m;l++)
			for(r=l;r<=m;r++)
				for(t=r-l+1;t<k;t++)
					for(j=0;j<4;j++)
						if(i<n&&f[i][l][r][t][j]>=0)
						{
							for(d=1;d<=ch[j][0];d++)
							{
								int lowl,higl,lowr,higr;
								get(l,r,ch[j][d],lowl,higl,lowr,higr);
								for(l0=lowl;l0<=higl;l0++)
									for(r0=max(l0,lowr);r0<=higr;r0++)
									{
										int tmp=f[i][l][r][t][j]+te[i+1][r0]-te[i+1][l0-1],&now=f[i+1][l0][r0][t+r0-l0+1][ch[j][d]];
										if(t+r0-l0+1<=k&&tmp>now)
											now=tmp,fr[i+1][l0][r0][t+r0-l0+1][ch[j][d]]=hash(i,l,r,t,j);
									}
							}
						}
	for(i=1;i<=n;i++)
		for(l=1;l<=m;l++)
			for(r=l;r<=m;r++)
				for(j=0;j<4;j++)
					if(ans<f[i][l][r][k][j])
						ans=f[i][l][r][k][j],la=hash(i,l,r,k,j);
	printf("Oil : %d\n",max(ans,0));
	for(;la;la=fr[i][l][r][t][j])
	{
		j=la/3200000,la%=3200000;
		t=la/8000,la%=8000;
		i=la/400,la%=400;
		l=la/20,la%=20;
		r=la;
		//printf("%d %d %d %d %d    %d\n",i,l,r,t,j,fr[i][l][r][t][j]);
		oc[lin][0]=i,oc[lin][1]=l,oc[lin][2]=r;
		lin++;
	}
	for(i=lin-1;i>=0;i--)
		for(j=oc[i][1];j<=oc[i][2];j++)
			printf("%d %d\n",oc[i][0],j);
	return 0;
}
个人工具