hdu4791 Labyrinth

来源:互联网 发布:windows设备管理器在哪 编辑:程序博客网 时间:2024/05/18 01:31

动态规划,对于每列,分别从上到下,从下到上,计算两种情况产生的最大值,然后取最大值。

#include<iostream>using namespace std;int data[100][100];int tempLine[100];#define MAX(a,b) (a>b?a:b)int main(){int qNum;int NowNum = 0;int m, n, mi, ni;//m * ncin >> qNum;//有qNum个问题while (NowNum++<qNum){//NowNum就是Case数cin >> m >> n;//inputfor (mi = 0; mi < m; ++mi)for (ni = 0; ni < n; ++ni)scanf("%d",&data[mi][ni]);for (ni = 0; ni < n; ++ni){if (ni == 0){//初始化for (mi = 1; mi < m; ++mi)data[mi][ni] += data[mi - 1][ni];continue;}for (mi = m - 1; mi >= 0; --mi)tempLine[mi] = (mi == m - 1 ? data[mi][ni - 1] : MAX(tempLine[mi + 1], data[mi][ni - 1])) + data[mi][ni];//最后一个等于左侧,其他的是下侧和左侧最大值for (mi = 0; mi < m; ++mi)data[mi][ni] += (mi == 0 ? data[mi][ni - 1] : MAX(data[mi - 1][ni], data[mi][ni - 1]));//第一个等于左侧,其他的是上侧和左侧最大值for (mi = 0; mi < m; ++mi)data[mi][ni] = MAX(tempLine[mi], data[mi][ni]);}printf("Case #%d:\n%d\n", NowNum, data[0][n - 1]);//cout << "Case #" << NowNum << ":\n" << data[0][n - 1]<<'\n';}}


0 0
原创粉丝点击