题解 P1854 【花店橱窗布置】

· · 题解

奥赛一本通上的方法自我感觉还是很机智的,不用递归了……

其实递归的方式找路线反而还好写……

#include<cstdio>
#include<cstring>
using namespace std;
int a[109][109],fmax[109][109],c[109][109],d[101],f,v,max=0,k;
int main()
{
    scanf("%d%d",&f,&v);
    for(int i=1;i<=f;i++)
    {
        for(int j=1;j<=v;j++)
        {
            scanf("%d",&a[i][j]);
        }
    }
    for(int i=1;i<=v-f+1;i++){fmax[1][i]=a[1][i];}//初始化
    for(int i=2;i<=f;i++)
    {
        for(int j=i;j<=v-f+i;j++)
        {
            for(int k=i-1;k<j;k++)
            {
                if(fmax[i-1][k]+a[i][j]>fmax[i][j])
                {
                    fmax[i][j]=fmax[i-1][k]+a[i][j],//状态转移
                    c[i][j]=k;//记录路径
                }
            }
        }
    }
    for(int i=f;i<=v;i++)
    {
        if(fmax[f][i]>max)
        {
            max=fmax[f][i];//找答案
            k=i;//找路
        }
    }
    printf("%d\n",max);
    for(int i=1;i<=f;i++){d[i]=k,k=c[f-i+1][k];}//找出摆放方案
    for(int i=f;i>=1;i--){printf("%d ",d[i]);}
    return 0;
}