花店櫥窗布置

2022-05-31 13:45:17 字數 2668 閱讀 7137

題面:

給定乙個 n * v 的矩陣

要求從第一行走到第f行,每行取走乙個數,

且該行所取的數必須必上一行所取的數的列數大 , 求所能取走的最大值

注意每一行所取走的數字的列數必須大於等該行的行號

因為必須給前面的花留下足夠的花瓶

由此我們便可以很容易的得出狀態轉移方程

dp [ i ] [ j ] = max ( dp [ i-1 ] [ k ] ) + d [ i ] [ j ] ( k < j )

dp [ i ] [ j ] = max ( dp [ i-1 ] [ k ] ) + d [ i ] [ j ] ( k < j )

dp [ i ] [ j ] = max ( dp [ i-1 ] [ k ] ) + d [ i ] [ j ] ( k < j )
其中dp [ i ] [ j ] 表示從第一行走到第 i 行並取走該行第j個數所能取得的最大值

①用字串陣列保留方案

設定string陣列 an [ i ] [ j ] , 在dp陣列轉移狀態時也一起轉移

我們知道string是可以直接相加的,那麼轉移的時候如果繼承上乙個狀態更優

那字元陣列就由上乙個狀態加上這次的選擇,也就是

if(dp[i-1][q]+a[i][j]>dp[i][j])

完整**

#include using

namespace

std;

intn,m;

int a[109][109

];int dp[109][109

];string an[109][109

];string zhuan(int

s)

for(int i=k.length()-1;i>=0;i--)

q+=k[i];

q+='-'

;

returnq;}

intmain()

//第i種花放在j位置

for(int i=1;i<=m;i++) dp[1][i]=a[1][i],an[1][i]=zhuan(i);

int maxn=0

;

for(int i=2;i<=n;i++)}}

}intnum;

for(int i=1;i<=m;i++)

}cout

for(int i=0;i)

}

view code

②用 int 陣列儲存方案

同樣的,定義pre [ i ] [ j ] 為讓 dp [ i ] [ j ] 最大時上乙個狀態選的什麼

初始化沒有上乙個狀態,所以指向自己

for(int i=1;i<=m;i++)    dp[1][i]=a[1][i],pre[1][i]=i;
然後我們和dp陣列一起轉移就是了

輸出方案的時候一路倒推回去

int ans[109],cnt=n;

ans[n]=num;//

最後乙個pre記錄不到,手動輸入

while(pre[cnt][num]!=num)

for(int i=1;i<=n;i++)

cout

";

二、跑dijtls最長路(懂什麼意思就行,錯是肯定寫錯了)

暫時不是很懂,先貼下別人**。

//

樓下全是dp,那麼來個最長路做法

////

那麼我們就可以連邊去跑最長路了

//同時我們注意到需要記錄路徑

//那麼這裡就選dij好了(因為其他的不會記路徑啊)

#include#include

#include

#include

#pragma gcc optimize(3)

#define re register

#define maxn 10001

#define maxw 800000

#define inf -99999999

using

namespace

std;

struct

node

e[maxw];

int f,v,ans,num=1

,end;

inthead[maxn],d[maxn],r[maxn];

int a[101][101

];typedef pair

pii;

priority_queue

,less>q;

inline

intread()

while(c>='

0'&&c<='9'

)

return r*x;

}inline

void add_edge(int x,int y,int

z)inline

void dijkstra(int

s) }

}void dfs(int

i)int

main()

cout

dfs(r[end]);

end%=v;

if(end==0) end=v;

cout

return0;

}

view code

花店櫥窗布置

題目描述 某花店現有f束花,每一束花的品種都不一樣,同時至少有同樣數量的花瓶,被按順序擺成一行,花瓶的位置是固定的,從左到右按1到v順序編號,v是花瓶的數目。花束可以移動,並且每束花用1到f的整數標識。如果i j,則花束i必須放在花束j左邊的花瓶中。例如,假設杜鵑花的標識數為1,秋海棠的標識數為2,...

花店櫥窗布置

不就是插花嗎?求出動態轉移方程,很容易啊。直接列出動態轉移方程。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 include define r i,a,b for int i a i b i using namespace...

花店櫥窗布置 DP

由 分析可以得知,這道題的擺放方案需要滿足 每行只選乙個數 美學值 且相鄰的兩行後一行的花瓶標號要大於前一行。那麼問題就轉換為了 在乙個數字 中,要求計算一條從頂至底的路徑,使得所經過的數字之和最大,且相鄰兩行中,後一行的列數要大於前一行。現在這道題和數塔問題很相似了,可以模擬求解。include ...