动态规划(DP),最大矩阵和

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=74

http://poj.org/problem?id=1050

解题报告:

1、用b[i]来记录某一行到第i行的某一列的和。

2、用b[k]=b[k]+a[j][k]来更新。

3、用sum=sum+b[k]来记录第i行到下面的那一行的那个矩阵的和(列数变化)。

4、if(sum<b[k])表示第k列之前的矩阵为负,最大和就为sum=b[k];

5、更新max。

#include <stdio.h>
#include <algorithm>
#include <string.h>

using namespace std;

int Max=-0x3f3f3f3f;///最优值
int a[105][105];///存储矩阵
int b[105];///b[i],表示之前的某一行到第i行的矩阵和

int main()
{
    int n;
    int i,j,k;
    scanf("%d",&n);
    for(i=0;i<n;i++)///输入矩阵
    {
        for(j=0;j<n;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(i=0;i<n;i++)///开始从第0行往下走
    {
        memset(b,0,sizeof(b));
        for(j=i;j<n;j++)///开始从i行往下走
        {
            int sum=0;///i~j行的矩阵和(列数不断变化)
            for(k=0;k<n;k++)
            {
                b[k]=b[k]+a[j][k];
                sum=sum+b[k];
                if(sum<b[k]) sum=b[k];///第k列之前为负,则最大和sum=b[k];
                if(sum>Max) Max=sum;
            }
        }
    }
    printf("%d\n",Max);
    return 0;
}
时间: 2024-10-10 12:46:59

动态规划(DP),最大矩阵和的相关文章

Fibonacci斐波拉契数列----------动态规划DP

n==10 20 30 40 50 46 体验一下,感受一下,运行时间 #include <stdio.h>int fib(int n){ if (n<=1)     return 1; else            return fib(n-1)+fib(n-2); }int main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib(n) );} 先 n==10 20 30 40 50 46

动态规划(DP),类似LIS,FatMouse&#39;s Speed

题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=1108 解题报告: 1.首先按照weight从小到大排列,weight相同的按照speed从大到小排列; 2.Count[i]表示到第i个老鼠时,所求的最长“速度递减”子序列的长度: 3.path[i]=j是题目的关键,记录在Count[i]=Count[j]时,即最长“速度递减”子序列最后一个老鼠的前一只老鼠的位置 4.递归输出id void output(in

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 1

#include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; } void f( ){ int i,j; for (i=1; i<=M; i++) for (j=0;j<=T; j++) { if (i==0) dp[i][j]=0; else dp[i][j]=

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 2

70 371 10069 11 2 #include <iostream>#include <string.h>using namespace std;int dp[105][1005], w[105],v[105],T,M;int max(int x,int y){ return x>y?x:y; }void f( ){ int i,j; for (i=M; i>=1; i--) for (j=0;j<=T; j++) { if (i==M+1) dp[i][j

(RQoj 15 采药------rwkj 10.1.5.253 1447) 动态规划 DP 3

#include <iostream>#include <string.h>using namespace std;int dp[1005], w[105],v[105],T,M;int max(int x,int y) { return x>y?x:y; }void f( ){ int i,j; for (i=1; i<=M; i++) for (j=T;j>=0; j--) if (j>=w[i]) dp[j]=max(dp[j],dp[j-w[i]]+

动态规划 DP

动态规划 DP 我们用f[ i ] 表示从 i 点出发到达终点的最多能休息的时间 然后我们发现 状态转移方程f[ i ] = f[ i+1 ] +1 ; 当该点 并没有工作计划时 f[ i ] = max(f[ i+len ],f[ i ]); 当该点 有工作计划时 一个或若干个 1 #include <bits/stdc++.h> 2 #define For(i,j,k) for(int i=j;i<=k;i++) 3 using namespace std ; 4 5 const i

poj 1458 动态规划DP

//  poj 1458  zoj 1733  最长公共子序列  DP #include <iostream>#include <string.h>#define N 1005using namespace std ;char  s1[N],s2[N];   int dp[N][N];int max(int a,int b)   {    return a>b ? a : b ;  }void f(int n,int m){   int i,j;    for (i=0; i

ppt Fibonacii数列的第n项------动态规划DP

#include <stdio.h>#define MAX 50+1int fib(int n){ int i,a[MAX]; a[1]=a[2]=1; for (i=3; i<=n; i++)               a[i]=a[i-1]+a[i-2];          return a[n];}void main( ){ int n; scanf("%d",&n); printf("%d\n" ,fib( n ) );} ppt

hdu2571 命运 动态规划Dp

转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2571 Problem Description 穿过幽谷意味着离大魔王lemon已经无限接近了! 可谁能想到,yifenfei在斩杀了一些虾兵蟹将后,却再次面临命运大迷宫的考验,这是魔王lemon设下的又一个机关.要知道,不论何人,若在迷宫中被困1小时以上,则必死无疑! 可怜的yifenfei为了去救MM,义无返顾地跳进了