您的位置:首页 > 其它

洛谷P1854 橱窗布置

2017-01-21 19:18 197 查看
1.此题的数据中有负数,所以dp数组的初始化为-inf!

2.用book数组存储路径,用递归来回溯路径。(book[x][y]表示第x轮、选到第y个花瓶时最大方案的前一个点)

f[x][y]:前x束花、前y个花瓶的最大美学值

初始化:f[0][0~v] = 0

状态转移方程:f[i][j] = f[i-1][k] + a[i][j]       (i-1 <= k < j)

#include<iostream>
#include<cstdio>
#define inf 9999999
using namespace std;

int f,v,a[101][101],dp[101][101],book[101][101];
//dp[x][y]:前x束花、前y个花瓶的最大美学值
//book[x][y]:第x轮、选到第y个花瓶时最大方案的前一个点

void print(int x,int y) {
if (x == 1) return; //因为记录的是前一个点,所以递归只到第二轮就可以输出第一个点
print(x-1,book[x][y]);
printf("%d ",book[x][y]);
}

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<=f; i++)
for (int j=1; j<=v; j++) {
dp[i][j] = -inf; //有负数时一定要初始化为-inf
for (int k=i-1; k<j; k++) if (dp[i-1][k]+a[i][j]>dp[i][j]) {
dp[i][j] = dp[i-1][k]+a[i][j];
book[i][j] = k;
}
}
int ans = 0,p;
for (int i=f; i<=v; i++) //这里要比较,因为花瓶不一定恰好选完
if (dp[f][i] > ans) {
ans = dp[f][i];
p = i;
}
printf("%d\n",ans);
print(f,p);
printf("%d",p); //输出最后一个点
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: