把图画出来 一眼看过去就特别像走矩阵取数 然后我们就这样做
但是要注意它的位置有限制 一个花束i可取的花瓶位置j在i~v-n+i之间
然后就是记录路径
#include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<algorithm> using namespace std; #define Max(x,y) (x)>(y)?(x):(y) #define Min(x,y) (x)>(y)?(y):(x) #define ll long long #define rg register const int N=200+5,M=100000+5,inf=0x3f3f3f3f,P=99999997; int n,m,a[N][N],f[N][N],pre[N][N],ay=1; bool vis[N]; template <class t>void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; } void print(int x,int y){ if(pre[x][y]==y) {printf("%d ",y);return;} print(x-1,pre[x][y]); printf("%d ",y); } int main(){ //freopen("in.txt","r",stdin); rd(n),rd(m); for(int i=1;i<=n;++i) for(int j=1;j<=m;++j) rd(a[i][j]),a[i][j]+=M; for(int i=1;i<=m-n+1;++i) f[1][i]=a[1][i],pre[1][i]=i; for(int i=2;i<=n;++i) for(int j=i;j<=m-n+i;++j) for(int k=1;k<j;++k) if(f[i-1][k]+a[i][j]>f[i][j]) f[i][j]=f[i-1][k]+a[i][j],pre[i][j]=k; for(int i=n;i<=m;++i) if(f[n][ay]<f[n][i]) ay=i; printf("%d ",f[n][ay]-M*n); print(n,ay); return 0; }