洛谷1854 花店橱窗布置

题目:花店橱窗布置


思路:

f[i][j]表示用前i束花,最后一朵花在第j个花瓶中的最大美学值。

转移方程:f[i][j]=max(f[i-1][k]+a[i][j])

g[i][j]表示这个状态的上一个状态为g[i-1][g[i][j]]。

最后通过g倒退来输出。


注意:边界,f初始化为-inf,f[1][i]=a[1][i]。


代码:

扫描二维码关注公众号,回复: 1799570 查看本文章
#include<bits/stdc++.h>
using namespace std;

#define maxn 100
#define inf (1<<30)

int n,m;
int a[maxn+5][maxn+5]= {0};
int f[maxn+5][maxn+5]= {0};	//f[i,j]:用前i束花,最后一朵花在第j个花瓶中的最大美学值
int g[maxn+5][maxn+5]= {0};	//g[i,j]:上一朵花的位置 

int main() {
	scanf("%d%d",&n,&m);
	for(int i=1; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			scanf("%d",&a[i][j]);
			f[i][j]=a[i][j];
		}
	}
	
	for(int i=2; i<=n; i++) {
		for(int j=1; j<=m; j++) {
			f[i][j]=-inf;
			for(int k=1; k<j; k++) {
				if(f[i-1][k]+a[i][j]>f[i][j]) {
					f[i][j]=f[i-1][k]+a[i][j];
					g[i][j]=k;
				}
			}
		}
	}
	
	int x=0,s=-inf;
	for(int i=1;i<=m;i++){
		if(s<f[n][i]) {
			s=f[n][i];
			x=i;
		}
	}
	printf("%d\n",s);
	
	int w=x,j=n;
	vector<int> vec;
	while(j){
		vec.push_back(w);
		w=g[j][w];
		j--;
	}
	
	for(int i=vec.size()-1;i>=0;i--) {
		printf("%d ",vec[i]);
	}
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/rabbit_zar/article/details/80830643
今日推荐