分离与合体这道题,我看很多大佬的做法都。。。不太亲民,就决定自己想一想。
虽然这是一道区间动规题,但我做的时候并没有往哪个方向想。我的总体思想就是最短路径思想,然后枚举,一个区间一个区间的枚举。
(真.无双.暴力)
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,a[301];//n为区间数,a数组为区间里金钥匙的价值
int f[301][301],path[301][301];//f[i][j]指的是从第i到第j区间可获得的金钥匙的最大价值
//path[i][j]存的是在i到j区间之间LYD分裂的区间
int q[301][2];
//q[i][0]为当前区间的左端点,q[i][1]为右端点
void Print()
{
int l=1,r=1;
q[1][0]=1,q[1][1]=n;
while(l<=r)
{
int a=path[q[l][0]][q[l][1]];
cout<<a<<" ";
if(q[l][0]!=a)
{
r++;
q[r][0]=q[l][0];
q[r][1]=a;
}
if(q[l][1]!=a+1)
{
r++;
q[r][0]=a+1;
q[r][1]=q[l][1]