校庆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;
}