[IOI 1999] 花店橱窗布置

[题目链接]

           https://www.luogu.org/problemnew/show/P1854v

[算法]

        f[i][j]表示放了前i束花,第i束花放在第j个花瓶中,所能获得的最大美学值

        由于要输出方案,我们不妨对于每个状态记一个pre,最后沿着pre数组反推出方案即可

[代码]

       

#include<bits/stdc++.h>
using namespace std;
#define MAXF 110
const int INF = 2e9;

int i,j,k,now,pos,F,V;
int a[MAXF][MAXF],f[MAXF][MAXF],pre[MAXF][MAXF];
vector< int > path;

int main() 
{
        
        scanf("%d%d",&F,&V);
        for (i = 1; i <= F; i++)
        {
                for (j = 1; j <= V; j++)
                {
                        scanf("%d",&a[i][j]);
                }
        }
        for (i = 1; i <= F; i++)
        {
                for (j = 0; j <= V; j++)
                {
                        f[i][j] = -INF;
                }
        }
        for (i = 1; i <= F; i++)
        {
                for (j = 1; j <= V; j++)
                {
                        for (k = j - 1; k >= 0; k--)
                        {
                                if (f[i - 1][k] + a[i][j] > f[i][j])
                                {
                                        f[i][j] = f[i - 1][k] + a[i][j];
                                        pre[i][j] = k;    
                                }        
                        }            
                }
        }
        pos = 1;
        for (i = 2; i <= V; i++)
        {
                if (f[F][i] > f[F][pos])
                        pos = i;    
        }
        printf("%d\n",f[F][pos]);
        now = F;
        while (now)
        {
                path.push_back(pos);
                pos = pre[now][pos];
                now--;
        }
        reverse(path.begin(),path.end());
        for (i = 0; i < path.size() - 1; i++) printf("%d ",path[i]);
        printf("%d\n",path[path.size() - 1]);
        
        return 0;
    
}

 

posted @ 2018-07-22 12:07  evenbao  阅读(205)  评论(0编辑  收藏  举报