这题符合动态规划的条件,即在每选一盆花时,选这盆花的操作不受上次选择的干扰,每一次维护数组时,都维护出了选第i盆花时的最优解

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int f,v;
int mp[200][200];
int dp[200][200];
int main(){
    cin>>f>>v;
    for(int x=1; x<=f; x++){
        for(int y=1; y<=v; y++){
            cin>>mp[x][y];
        }
    }
    memset(dp,-0x3f3f3f3f,sizeof(dp));
    for (int i = 1; i <=v; ++ i) 
        dp[1][i] = mp[1][i];
    for(int i=2; i<=f; i++){
        for(int j=1; j<=v; j++){
            for(int k=1; k<j; k++)
                dp[i][j]=max(dp[i][j],dp[i-1][k]+mp[i][j]);
        }
    }
    int sum=-0x3f3f3f3f;
    for(int i=1; i<=v; i++)
        //cout<<dp[3][i]<<" ";
       sum=max(sum,dp[f][i]);
       cout<<sum<<endl;
        
    int res[200];
    for(int y=f; y>=1; y--){
        for(int x=v; x>=1; x--){
            if(dp[y][x]==sum)
            {res[y]=x;}
        }
        sum=sum-mp[y][res[y]];
    }
    for(int i=1; i<=f; i++)
        cout<<res[i]<<" ";
    return 0;
}

注意每一次并不是拿上次的最优解来加上当前盆的值,这样的贪心策略是错误的,因为这一次的贡献可能比上次更多。