目录

Single Problem Set (1)


1.方格取数

Code

Code

#include<stdio.h>
#include<string.h>
#define condition(con,tr,fa) ((con)?(tr):(fa))
#define max(a,b) condition(a>b,a,b)
#define min(a,b) condition(a<b,a,b)
#define reset(arr) memset(arr,0,sizeof(arr))
 
int map[10][10];
int ans[20][10][10];
int ansflag[20][10][10];
int n;
 
int ansf(int step,int x1,int x2){
	if(step==0)return map[0][0];
	if(ansflag[step][x1][x2]>0){
		return ans[step][x1][x2];
	}
	int y1=step-x1;
	int y2=step-x2;
 
	int temp=0;
	if(x1>0 && x2>0) temp=max(temp,ansf(step-1,x1-1,x2-1));
	if(x1>0 && y2>0) temp=max(temp,ansf(step-1,x1-1,x2));
	if(y1>0 && x2>0) temp=max(temp,ansf(step-1,x1,x2-1));
	if(y1>0 && y2>0) temp=max(temp,ansf(step-1,x1,x2));
	ans[step][x1][x2]=temp+map[x1][y1]+map[x2][y2]*condition(x1==x2,0,1);
	ansflag[step][x1][x2]=1;
 
	return ans[step][x1][x2];
}
 
int main(){
	reset(map);
	reset(ans);
	reset(ansflag);
 
	scanf(%d”,&n);
 
	int x,y,val=1;
	while(x!=0 || y!=0 || val!=0){
		scanf(%d%d%d”,&x,&y,&val);
		map[x-1][y-1]=val;
	}
	/*
	printf(“\n”);
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			printf(%d ”,map[i][j]);
		}
		printf(“\n”);
	}printf(“\n”);
	*/
 
	printf(%d”,ansf(n*2-2,n-1,n-1));
}

2.传纸条

Code

Code

#include<stdio.h>
#include<string.h>
#define condition(con,tr,fa) ((con)?(tr):(fa))
#define max(a,b) condition(a>b,a,b)
#define min(a,b) condition(a<b,a,b)
#define reset(arr) memset(arr,0,sizeof(arr))
 
#define MAXN 51
 
int map[MAXN][MAXN];
int ans[MAXN+MAXN][MAXN][MAXN];
int ansflag[MAXN+MAXN][MAXN][MAXN];
int m,n;
 
 
int ansf(int step,int x1,int x2){
	if(step==0)return map[0][0];
	if(ansflag[step][x1][x2]>0){
		return ans[step][x1][x2];
	}
	int y1=step-x1;
	int y2=step-x2;
 
	int temp=0;
	if(x1>0 && x2>0 && x1-1!=x2-1) temp=max(temp,ansf(step-1,x1-1,x2-1));
	if(x1>0 && y2>0 && x1-1!=x2) temp=max(temp,ansf(step-1,x1-1,x2));
	if(y1>0 && x2>0 && x1!=x2-1) temp=max(temp,ansf(step-1,x1,x2-1));
	if(y1>0 && y2>0 && x1!=x2) temp=max(temp,ansf(step-1,x1,x2));
 
	ans[step][x1][x2]=temp+map[y1][x1]+map[y2][x2];//*condition(x1==x2,0,1);
	ansflag[step][x1][x2]=1;
 
	return ans[step][x1][x2];
}
 
int main(){
	reset(map);
	reset(ans);
	reset(ansflag);
 
	scanf(%d%d”,&m,&n);
 
	int x,y,val=1;
	for(int i=0;i<m;i++)
	for(int j=0;j<n;j++)
		scanf(%d”,&map[i][j]);
	printf(%d”,ansf(m+n-2,n-1,n-1));
 
 
}