现在有f朵花,v个花瓶摆成一排,第i朵花放在第j个花瓶的美学值记做\(a[i][j]\),现在要把所有花放入花瓶,并保证花瓶从左至右放的编号递增,同一个花瓶最多只能放一朵花,问最大的美学值之和,\(1<=F<=V<=100\)。
解
显然既要表现花,又要表现花瓶,没有特殊限制,故设\(f[i][j]\)表示前i朵花放到前j个花瓶的最大美学值之和,因此不难有
\[f[i][j]=\max(f[i][j-1],f[i-1][j]+a[i][j])\]
边界:\(f[0][0]=0\),其余负无限大
答案:\(f[f][v]\)
参考代码:
#include#include #include #define il inline#define ri registerusing namespace std;int a[101][101],dp[101][101], pre[101][101];void print(int,int);int main(){ int f,v; scanf("%d%d",&f,&v); for(int i(1),j;i<=f;++i) for(j=1;j<=v;++j) scanf("%d",&a[i][j]); memset(dp,-2,sizeof(dp)); for(int i(0);i<=v;++i)dp[0][i]=0; for(int i(1),j;i<=f;++i) for(j=i;j<=v;++j){ if(dp[i][j-1]