P1854 花店橱窗布置

P1854 花店橱窗布置

0x01 题意

给一个\(m\times n\)的矩阵,\(m\leq n\),在每一行选一个数,满足每一行选择数的位置在上一行选择数位置的后面,求所有选择的数的和的最大值和每一行选择的数的位置

0x02 解

数据不大

搞式子

\[dp[i][j]=max(dp[i-1][k])+val[i][j]\,\,\,\,\,(k<j) \]

再开个数组记录每次选择的数的位置

最后递归输出就行了

0x03 码

#include<bits/stdc++.h>
using namespace std;
const int N=1010;

int m,n,d[N][N],dp[N][N],pre[N][N];

void print(int x,int y){
	if(pre[x][y]==y){printf("%d ",y);return;}
	print(x-1,pre[x][y]);
	printf("%d ",y);
}

int main(){
	cin>>m>>n;
	
	for(int i=1;i<=m;i++)
		for(int j=1;j<=n;j++)
			cin>>d[i][j];
	
	for(int i=1;i<=n-m;i++)
		dp[1][i]=d[1][i],pre[1][i]=i;
		
	for(int i=2;i<=m;i++){
		for(int j=i;j<=n-m+i;j++){
			for(int k=1;k<j;k++){
				if(dp[i-1][k]+d[i][j]>dp[i][j]){
					dp[i][j]=dp[i-1][k]+d[i][j];;
					pre[i][j]=k;
				}
			}
		}
	}
	
	int tx=m,ty,ans=0;
	for(int i=m;i<=n;i++) if(dp[m][i]>ans){ans=dp[m][i];ty=i;}
	
	cout<<ans<<endl;
	print(tx,ty);
	
	return 0;
}
posted @ 2021-03-08 07:31  wsy_jim  阅读(85)  评论(0编辑  收藏  举报