第一道DP,虽然看题解过的,但是对DP有了新的了解,前两天看了论文,还是没有更好的理解,最近再跟学弟做DP,呜呜····好渣啊,这道题我觉得是背包的变形嘛,题意是
有V种花,F个花盆,问你这V种花怎么放,得出的价值最大呢。这里还有要求,V个花,从1-V编号,F个盆也是从1-F编号,第 i 个 花必须放在 第i+1个花的右边,每个花不能再相同行和相同列。所以呢,状态转移方程为
dp[i][j] = max(dp[i-1][j-1] + a[i][j] ,dp[i][j-1])
#include<iostream>
#include<cstdio>
#include<string.h>
#include<string>
#include<set>
#include<algorithm>
#include<cmath>
#define ll __int64
#define MAX 1000009
using namespace std;
int a[509][509];
int dp[509][509];
// DP 表示 前i朵花放进j个瓶子的价值
// a 表示 第i朵花放进第i个瓶子的价值
int main()
{
int i,j;
int n,m;
while(~scanf("%d%d",&n,&m))
{
memset(dp,0,sizeof(dp));
memset(a,0,sizeof(a));
for(i = 1;i<=n;i++)
{
for(j = 1;j<=m;j++)
{
scanf("%d",&a[i][j]);
}
dp[i][i] = dp[i-1][i-1] + a[i][i];//预处理
}
for(i = 1;i<=n;i++)
{
for(j = i+1;j<=m;j++)
{
dp[i][j] = max(dp[i-1][j-1] + a[i][j] ,dp[i][j-1]);//放还是不放
}
}
printf("%d\n",dp[n][m]);
}
return 0;
}