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;
}