這裡是題幹:
好吧,這道題其實用動態規劃就好了,但是無聊的老師居然還讓我用樹狀陣列的方法再做一遍,又過去了乙個上午。
先說思路:這道題可以拆分為乙個上公升子串行和乙個下降子串行的組合,再列舉中間最高的人的位置,將以他結尾的最大上公升序列和以他開頭的最大下降序列相加,再求乙個最大值就好了。
那麼,問題來了——
我們在**可以用到樹狀陣列呢?
在輸入的時候我們用乙個f陣列來儲存在這個數輸進來之前有多少個數比他小,其中去乙個最大值,再加上一作為這個數的f陣列的值。
我們再用乙個s[x]表示從f[x]到f[x-lowbit(x)+1]這些之裡面的最大值。
在更改完乙個f陣列的值之後,s陣列也要跟著改變,需要改變的陣列和其他的樹狀陣列一樣,就不詳細列出來了,直接看**就好了。之後,f[x]的值也要更新一下,f[x]=s[x]+s[x-lowbit(x)]-……,這個過程也是相似的。
這個是求以x結尾的最長上公升子串行,那麼求以x開頭的最長下降子串行也是大同小異,只不過是從後往前做了。。。
最後附上**:
#include
#include
using
namespace
std;
int n,a[110][2],s[110],f[110][2];
inline
int lowbit(int x)
int findmax(int x)
return ans;
}void update(int x,int value)
}int main()
for(int j=0;j<=1;++j)
}int ans=0;
for(int i=1;i<=n;++i)
ans=max(ans,f[i][0]+f[n+1-i][1]-1);
cout
0;}
說實話,這些東西都不靠死記硬背,理解才是硬道理。。。 P1091 合唱隊形
n位同學站成一排,老師要請其中的 n k 位同學出列,使得剩下的k位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2 k,他們的身高分別為t1,t2,tk,則他們的身高滿足t1 ti 1 tk 1 i k 你的任務是,已知所有n位同學的身高,計算最少需要幾位同學出列,...
P1091 合唱隊形
nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足t1 ti 1 t...
P1091 合唱隊形
題目描述 nnn位同學站成一排,老師要請其中的 n kn kn k 位同學出列,使得剩下的kkk位同學排成合唱隊形。合唱隊形是指這樣的一種隊形 設k位同學從左到右依次編號為1,2,k1,2,k1,2,k,他們的身高分別為t1,t2,tkt 1,t 2,t kt1 t2 tk 則他們的身高滿足 t1 ...