程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> Codeforces Round #245 (Div. 1)B 遞推DP

Codeforces Round #245 (Div. 1)B 遞推DP

編輯:C++入門知識

Codeforces Round #245 (Div. 1)B 遞推DP


1000 * 1000的圖,交點就一個,而且如何相交於一點 畫一畫就會發現就兩種情況,所以首先想到的是可以暴力枚舉交點,然後由交點往前推,相交過後兩個人繼續朝自己目的地前進,所以可以先 暴力枚舉 並 遞推出每一個點 到這個圖的 四個頂點的 最大值,然後根據相交的兩種情況取最優的一個即可


int mp[1000 + 55][1000 + 55];

int dp1[1000 + 55][1000 + 55],dp2[1000 + 55][1000 + 55],dp3[1000 + 55][1000 + 55],dp4[1000 + 55][1000 + 55];

int n,m;

void init() {
	memset(mp,0,sizeof(mp));
	memset(dp1,0,sizeof(dp1));
	memset(dp2,0,sizeof(dp2));
	memset(dp3,0,sizeof(dp3));
	memset(dp4,0,sizeof(dp4));
}

bool input() {
	while(cin>>n>>m) {
		for(int i=1;i<=n;i++)
			for(int j=1;j<=m;j++)
				scanf("%d",&mp[i][j]);
		return false;
	}
	return true;
}

void cal() {
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			dp1[i][j] = mp[i][j] + max(dp1[i - 1][j],dp1[i][j - 1]);//遞推當前點到左邊上邊頂點大最大值
	for(int i=1;i<=n;i++)
		for(int j=m;j>0;j--)
			dp2[i][j] = mp[i][j] + max(dp2[i - 1][j],dp2[i][j + 1]);//右邊上邊...
	for(int i=n;i>0;i--)
		for(int j=1;j<=m;j++)
			dp3[i][j] = mp[i][j] + max(dp3[i + 1][j],dp3[i][j - 1]);//左邊下邊...
	for(int i=n;i>0;i--)
		for(int j=m;j>0;j--)
			dp4[i][j] = mp[i][j] + max(dp4[i + 1][j],dp4[i][j + 1]);//右邊下邊...
	int ans = 0;
	/*暴力枚舉交點,交點就一個*/
	for(int i=2;i

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved