10分递推求助!!
查看原帖
10分递推求助!!
148634
DQM_Charley楼主2020/11/21 22:18
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int g[1001][1001];
int c[1001][1001];
int n, m;

void input();
void todo();
void v() {
	puts("");
	for(int i = 0; i < n; ++i) {
		for(int j = 0; j < m; ++j)
			cout << c[i][j] << ' ';
		puts("");
	}
	puts("");
}

int main(){
	input();
	todo();
	printf("%d", c[n-1][m-1]);
	return 0;
}

void todo() {
	c[0][0] = g[0][0];
	for(int i = 0; i < m; ++i)
		c[i][0] = g[i][0] + c[i - 1][0];
	for(int i = 1; i < m; ++i) {
		for(int j = 0; j < n; ++j) {
			int t = c[j][i - 1] + g[j][i];
			if(t > c[j][i])
				c[j][i] = t;
			if(c[j + 1][i] < t + g[j + 1][i]) {
				c[j + 1][i] = t + g[j + 1][i]; 
				for(int k = j + 1; k < m; ++k) {
					c[k][i] = c[k - 1][i] + g[k][i];
				}
			}
			if(c[j - 1][i] < t + g[j - 1][i]) {
				c[j - 1][i] = t + g[j - 1][i]; 
				for(int k = j - 1; k >= m; --k) {
					c[k][i] = c[k + 1][i] + g[k][i];
				}
			}
		}
	}
}

void input() {
	scanf("%d%d", &n, &m);
	for(int i = 0; i < n; ++i)
		for(int j = 0; j < m; ++j)
			scanf("%d", &g[i][j]);
	memset(c, 0xf0, sizeof(c));
	return ;
}

程序思路:

每次求出单列每格的最优解,一列列往下递推


这种方法我同学能得70分,各位dalao帮忙看下哪里有错,谢谢!

2020/11/21 22:18
加载中...