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