题目大意
解题思路:
不就是插花吗?
求出动态转移方程,很容易啊。
直接列出动态转移方程。
**b[i][j]=max(b[i][j],b[i-1][k-1]+a[i][k]);
i=1..f;j=i..v-f+i;k=i..j;**
#include <cstdio>
#include <cstring>
#define r(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
int a[101][101],b[101][101],c[101],f,v,e;
void read(int &f)//装b输入(会快很多)
{
f=0;bool d=0;char c;
while (c=getchar(),c<'0'||c>'9') if (c=='-') d=1;f=f*10+c-48;
while (c=getchar(),c>='0'&&c<='9') f=f*10+c-48;
if (d) f*=-1;
}
void write(int x)//装b输出(会快很多)
{
if (x<0) {x=-x;putchar('-');}
if (x) write(x/10);else return;
putchar(x%10+48);
}
int max(int x,int y)//iostream 库里有,但是自己打会快一些
{
return x>y?x:y;
}
void print(int i,int j)//输出分别插第几个花瓶
{
int n;
if(i>0)
{
n=i;
while (b[i][n]!=j)
n++;
print(i-1,j-a[i][n]);
write(n);putchar(32);
}
}
int main()
{
e=-2147483647;//因为是找最大值,而且有负数,所以不能定义为0
read(f);read(v);
r(i,1,f)
r(j,1,v)
read(a[i][j]);//读入
memset(b,128,sizeof(b));//初始化
r(i,0,100) b[0][i]=0;//初始化
r(i,1,f)
r(j,i,v-f+i)
r(k,i,j)
b[i][j]=max(b[i][j],b[i-1][k-1]+a[i][k]);//更新最优值
r(i,f,v)
e=max(e,b[f][i]);//选择全局最优解
if (!e) putchar(48);else
write(e);
putchar(10);
print(f,e);//根据最优解求出花插在哪个花瓶
return 0;
}
可能做的不好的地方较多,大佬勿喷