zoukankan      html  css  js  c++  java
  • 1083 矩阵取数问题(DP)

    基准时间限制:1 秒 空间限制:131072 KB 分值: 5 难度:1级算法题
     收藏
     关注
    一个N*N矩阵中有不同的正整数,经过这个格子,就能获得相应价值的奖励,从左上走到右下,只能向下向右走,求能够获得的最大价值。
     
    例如:3 * 3的方格。
     
    1 3 3
    2 1 3
    2 2 1
     
    能够获得的最大价值为:11。
    Input
    第1行:N,N为矩阵的大小。(2 <= N <= 500)
    第2 - N + 1行:每行N个数,中间用空格隔开,对应格子中奖励的价值。(1 <= N[i] <= 10000)
    Output
    输出能够获得的最大价值。
    Input示例
    3
    1 3 3
    2 1 3
    2 2 1
    Output示例
    11
     
    简单DP问题,刚开始想的是从a[1][1]开始通过比较a[x+1][y]和a[x][y+1]的大小来找出最优解,可是如果a[x+1][y]和a[x][y+1]的大小相等就没办法往后计算了,后来看了别人的代码发现了别人是通过dp数组到这来找最优解的
    分析:公式:maxnsum[i][j]=max(maxnsum[i-1][j],maxnsum[i][j-1])+dp[i][j];
    #include<bits/stdc++.h>
    #define maxn 500+10
    using namespace std;
    
    int a[maxn][maxn];
    int dp[maxn][maxn];
    int i,j;
    int n;
    int main()
    {
    	while(scanf("%d",&n)!=EOF)
    	{
    		memset(dp, 0, sizeof(dp));
    		memset(a, 0,sizeof(a));
    		for(i=1; i<=n; i++)
    		{
    			for(j=1; j<=n; j++)
    			{
    				scanf("%d",&a[i][j]);		
    			}
    		}
    		for(i=1; i<=n; i++)
    		{
    			for(j=1; j<=n; j++)
    			{
    				dp[i][j] = max(dp[i-1][j], dp[i][j-1]) + a[i][j];		
    			}
    		}		
    		printf("%d
    ",dp[n][n]);
    	}		
    	return 0;
    }
    

      

     
     
     
     
     
     
     





    永远渴望,大智若愚(stay hungry, stay foolish)
  • 相关阅读:
    17年day4
    11.7NOIP模拟题
    P3389 【模板】高斯消元法
    洛谷 P2136 拉近距离 题解
    浅谈SPFA判负环
    洛谷 P1629 邮递员送信 题解
    洛谷 P1821 [USACO07FEB]银牛派对Silver Cow Party 题解
    洛谷 P3905 道路重建 题解
    洛谷 P1351 联合权值 题解
    洛谷 P4779 【模板】单源最短路径(标准版) 题解
  • 原文地址:https://www.cnblogs.com/h-hkai/p/7486328.html
Copyright © 2011-2022 走看看