POJ1157 LITTLE SHOP OF FLOWERS DP

题意:

题目说得很文艺,其实很简短的几句话就可以说清楚了。

给你一个二维矩阵,每行取一个数,满足取的数的位置从上到下的同时是从左到右。

即在第i行取第j个数的话,在i+1行则不能取第1到第j个数。

问取的这些数的和最大值是多少。

思路:

看到这种二维矩阵找数字本能反应就是DP了。

很容易就可以写出状态转移方程:

dp[i][j]=max(dp[i-1][j-1]+mat[i][j],dp[i][j-1])

但是需要注意的是要处理好边界。

#include<iostream>
#include<algorithm>
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
using namespace std;
const int N=105;
int mat[N][N];
int dp[N][N];
int f,v;
int main()
{
	scanf("%d%d",&f,&v);
	for(int i=1;i<=f;i++)
		for(int j=1;j<=v;j++)
		{
			scanf("%d",&mat[i][j]);
		}
	for(int i=1;i<=f;i++)
	{
		dp[i][i]=dp[i-1][i-1]+mat[i][i];//这里的边界问题要写,否则wa
		for(int j=i+1;j<=v;j++)
		{
			dp[i][j]=max(dp[i-1][j-1]+mat[i][j],dp[i][j-1]);
		}
	}
	printf("%d\n",dp[f][v]);
	return 0;
}


你可能感兴趣的:(POJ1157 LITTLE SHOP OF FLOWERS DP)