**校庆100周年**dpC++ by prayer.hustoj.com

校庆100周年dpC++ by prayer.hustoj.com

题目描述
在建校100周年之际,学校决定举办校庆活动,发出校庆通告和邀请后,学校收到了k条的祝贺条幅,在把这些条幅挂起来的时候,学校负责人要考虑到祝贺单位和个人的知名度和发送祝贺的先后顺序,觉得有必要统筹地安排位置来挂这些条幅。
在校门口的正面,有一座气势雄伟的行政楼,前面有n(1<=k<=n<=100)多的位置可以用来挂条幅,如何把这k条条幅挂到这n个位置上使之总体效果最大呢?学校负责人是这样考虑的:首先给所有条幅按照送来的顺序从1开始编号,然后给综合楼可挂条幅的位置也从1开始编号,无论怎么考虑最大效果,编号小的条幅必须挂在编号大的条幅的前面(即所在位置的编号较小);但考虑到送条幅单位或个人知名度的问题,负责人又给每个条幅挂在每个位置上的效果打了分。最终希望挂条幅的效果分到达最大。
输入
第一行包含二个空格分隔的整数k和n,分别表示总条幅数量和总的可挂条幅的数量。下面一共有k行,每行有n个空格分隔的整数,输入文件第i+1行第j列的整数表示编号为i的条幅挂在编号为j的位置上的效果分(在-50到50之间)。
输出
包含一行一个整数,表示可能获得的最大的效果分。
样例输入 Copy
3 5
7 23 -5 -24 16
5 21 -4 10 23
-21 5 -4 -20 20
样例输出 Copy
53

思路:f[i][j]表示前i个条幅放了j个

#include<bits/stdc++.h>
using namespace std;
int const N=100+1;
int f[N][N],n,m,a[N][N];
int main(){
  scanf("%d%d",&n,&m);
  for (int i=1;i<=n;i++)
    for (int j=1;j<=m;j++)
      scanf("%d",&a[i][j]);
  for (int i=1;i<=n;i++)
    for (int j=i;j<=m;j++)
      if (i==j) f[i][j]=f[i-1][j-1]+a[i][j];
      else f[i][j]=max(f[i-1][j-1]+a[i][j],f[i][j-1]);
  cout<<f[n][m]<<endl;
  return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值