经典插花的教训 PKU 1157
很早以前做过的题,,以为可以秒A ,就立刻敲了
结果
骄兵必败啊。。
心急吃不了豆腐
所以,惩罚自己写个解题报告
题意:有N种花,M个花瓶
按每种花插在不同的花瓶有不同的值。(可以有负数)
要求按照顺序把花插在花瓶上,先出现的花必须插在后给的花的前方,,
要求给出最大值
分析:
类似数塔的DP
只是方向是向右下方出发
每一行取一个值,
乱七八糟的一坨,,先搁着吧,,改了一个小时的代码,,越改越慢,,可是。还是有用到最近学的东西,,欣慰下,,当做练习吧,,不能为了做题而做题
#include<iostream>
#define Nmax 105
using namespace std;
const int INF=-600000;
int Max(int a,int b)
{
return a>b?a:b;
}
int main()
{
int n,m;
int ans[Nmax],col[Nmax],max_sign[Nmax];
while(scanf("%d%d",&n,&m)!=EOF)
{
scanf("%d",&max_sign[0]);
for(int j2=1;j2<m;j2++)
{
scanf("%d",&ans[j2]);
max_sign[j2]=Max(ans[j2],max_sign[j2-1]);
}
int len=m-n+1;
for(int i=1;i<n;i++)
{
len++;
int a=max_sign[i-1];
for(int j=0;j<m;j++)
{
scanf("%d",&col[j]);
if(j>=i&&j<len)
{
ans[j]=a+col[j];
a=max_sign[j];
max_sign[j]=Max(ans[j],max_sign[j-1]);
}
}
}
int ANS=INF;
for(int tt=n-1;tt<m;tt++)
if(ans[tt]>ANS)ANS=ans[tt];
cout<<ANS<<endl;
}
return 0;
}