题解 | #[NOIP2000]方格取数#

[NOIP2000]方格取数

https://ac.nowcoder.com/acm/problem/16759

思路:将两个人想象为同时走,这样每个状态 i1+j1==i2+j2==k 且可以布满棋盘,因为由k可以推出j1,j2,即每一步的具***置,故状态为f(k,i1,i2) (注:f[k][i1][i2]表示两人经过同样步数,甲在arr[i1]j1, 乙在arr[i2]j2位置时取数的最大值)

下面分析状态的转移计算,有四种情况: 如果到这个步数甲乙没有重合: f(i1,j1,i2,j2)=f(i1-1,j1,i2-1,j2)+arr[i1][j1]+arr[i2][j2] //对应甲从左边来,乙从左边来,下面同理可推 f(i1,j1,i2,j2)=f(i1-1,j1,i2,j2-1)+arr[i1][j1]+arr[i2][j2] f(i1,j1,i2,j2)=f(i1,j1-1,i2-1,j2)+arr[i1][j1]+arr[i2][j2] f(i1,j1,i2,j2)=f(i1,j1-1,i2,j2-1)+arr[i1][j1]+arr[i2][j2] 如果到这个步数甲乙重合: f(i1,j1,i2,j2)=f(i1-1,j1,i2-1,j2)+arr[i1][j1] //甲取走数,该位置的数变为0,对应甲从左边来,乙从左边来,下面同理可推 f(i1,j1,i2,j2)=f(i1-1,j1,i2,j2-1)+arr[i1][j1] f(i1,j1,i2,j2)=f(i1,j1-1,i2-1,j2)+arr[i1][j1] f(i1,j1,i2,j2)=f(i1,j1-1,i2,j2-1)+arr[i1][j1]

优化为3维就是 f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1 - 1][i2 - 1] + t); f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1 - 1][i2] + t); f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1][i2 - 1] + t); f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1][i2] + t);//因为k=i1+j1=i2+j2. i1,i2不变, k-1时, 则对应j1-1, j2-1

最终ac代码如下: #include #include #include

using namespace std;

const int N=15; int arr[N][N]; int f[N + N][N][N];

//将两个人想象为同时走,这样每个状态 i1+j1==i2+j2==k 且可以布满棋盘,因为由k可以推出j1,j2,即每一步的具***置,故状态为f(k,i1,i2) int main() { int r; cin >> r;

int a, b, c;
while (cin >> a >> b >> c&&a || b || c)
{
	arr[a][b] = c;
}
for(int k=2;k<=2*r;k++)
	for(int i1=1;i1<=r;i1++)
		for (int i2 = 1; i2 <= r; i2++)
		{
			int j1 = k - i1, j2 = k - i2;
			if (j1>=1&&j1<=r&&j2>=1&&j2<=r)//注意判断条件
			{
				int t = arr[i1][k - i1];
				if (i1 != i2)t += arr[i2][k - i2];//注意加的逻辑,如果不重合 arr[i1][j1]可能不等于arr[i2][j2],需要加上两个
				f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1 - 1][i2] + t);
				f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1][i2 - 1] + t);
				f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1 - 1][i2 - 1] + t);
				f[k][i1][i2] = max(f[k][i1][i2], f[k - 1][i1][i2] + t);
			}
			
		}
cout << f[r+r][r][r] << endl;

}

全部评论

相关推荐

今天提了离职,领导说让我离职前请几位正式工吃饭……我本来是有请客的打算的,因为感觉这几个同事人还挺好,想以后维持一下关系。但我第一次听领导主动说让实习生请客的……(只因为一个请客,倒不至于发个帖子。主要是这个公司的离谱事情太多了,跟之前的实习感受完全不同)之前几段实习,在实习结束前,mentor或领导会请客欢送,无论是私下吃个便饭也好,还是全部门的奶茶也好。这几位正式工既不是我的mentor,也不是我的领导。而且我异地实习生活很拮据,这家公司给得很少。当然了,这也算意料之外,情理之中。这家公司一直对实习生很不友好。经常让实习生加班,总是跟实习生说“辛苦一下”。你也没给我那个辛苦钱啊!晚上干到12点,周末加班干,要么是领导要看,要么是客户着急。之前的公司,我主动加班,mentor都会跟我说,实习生不用加班,到点下班就行。加班就算了,我安慰自己就当学东西了,锻炼抗压能力。但辛苦完了,节日的福利,竟然只有正式员工才有?!我之前实习,实习生的节日福利一点也不比正式工少啊……有的正式工还会把福利分给实习生一部分。挺心寒的……而且,我觉得这家公司对实习生很不负责,纯拿你当廉价劳动力。可以让刚毕业才工作三个月的人带实习生,实习生不会的,正式员工也不会,俩人就一起探索。还真就那个“和公司共同成长”😅避雷某GJ级专精特新小巨人企业,六百多人,整体氛围挺离谱的,跟我去过的其他公司完全不一样。领导都是些老东西,喜欢PUA,爹味十足。流程混乱、管理混乱、代码混乱、职责混乱,技术领导不懂技术,总说出一些可笑的畅想。虽然技术不咋地,但是把产品技术路线吹上天的本事倒是有,而且很大!什么xx系统、xx模型、xx工具,名字一个比一个高大上,其实可能就是调用Qwen、DeepSeek、Doubao……还声称这两年要上市,我祝你们成功吧😄
不知道怎么取名字_:实习的能有多少钱,为啥要请客
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务