题意:输入两个整数 F 和 V,分别表示花的数量和花瓶的数量,接下来输入F行V列的表格如下;value[i][j]表示花i放在瓶j里面的价值;规定把F束花放在V个花瓶里,使花的相对顺序不能变,即1在2前面,2在3前面......。 求怎样放能使价值总和最大,输出最大值。
思路:dp[i][j] 表示 表示前i束花放在前j个花瓶中审美的最大值
状态转换方程:
dp[i][j] = state[i-1][j-1] + value[i][j] if i == j
dp[i][j] = max { state[i-1][j-1] + value[i][j], state[i][j-1] } if i < j
#include <cstdio>
#include <iostream>
#include <cstring>
#define N 105
#define MAX(A,B) ((A)>(B)?(A):(B))
int dp[N][N] ;
int value[N][N] ;
using namespace std ;
int F , V ; //F 代表flowers , V 代表 vases
void
Solve ( )
{
for ( int i = 1 ; i <= F ; i ++ )
{
for ( int j = 1 ; j <= V ; j ++ )
{
if ( i == j )
{
dp[i][j] = dp[i-1][j-1] + value[i][j] ;
}
else if ( i < j )
{
dp[i][j] = MAX ( dp[i-1][j-1] + value[i][j] , dp[i][j-1] ) ;
}
}
}
printf ("%d\n" , dp[F][V] ) ;
return ;
}
int
main ( )
{
while ( EOF != scanf ("%d%d" , & F , & V ) )
{
for ( int i = 1 ; i <= F ; i ++ )
{
for ( int j = 1 ; j <= V ; j ++ )
{
scanf ("%d" , & value[i][j] ) ;
}
}
Solve ( ) ;
}
return 0 ;
}