題意是求乙個數列的不遞減的子串行的個數;
很顯然,如果只用dp來做的話時間是o(n*n) 因為dp【i】為前i個數可能的方案,則狀態轉移方程為dp【i】=sum(dp【j】,j
先對num按數來進行排序,(這道題因為資料較大 用到了離散化) 因為更新是是按原序更新的,及i之前的num【j】一定比num【i】小,維護了不遞減的原則,更新是從mark【i】(表示原序列i在排序後的位置)開始更新 這就維護了子串行的原則,最後求和就行;
#include#include#include#includeusing namespacestd;#define mod 1000000007structnodenum[100010];
intcmp(node a,node b)
intcont[100010],n;
intupdate(
inta,
intb)
return0;
}intfind(
inta)
returns;
}int
main
()sort(num+1,num+1+n,cmp);
intk=-1,t=0;
for(i=1;i<=n;i++)
mark[num[i].ii]=t;
}memset(cont,0,
sizeof
(cont));
for(i=1;i<=n;i++)
printf("%d\n",find(n));
}return0;
}
hdu2227 樹狀陣列優化dp
hdu2227 find the nondecreasing subsequences 傳送門題意 有乙個長度為 n 1 leq n leq 100000 的數列,計算所有不下降子串行的個數,答案對 1e9 7 取模 題解 遞推式 dp i sum dp j 1,j 離散化之後遍歷序列,樹狀陣列維護...
hdu5489 樹狀陣列 dp
2015 10 06 21 49 54 這題說的是個給了乙個陣列,然後刪除任意起點的乙個連續的l個數,然後求最長遞增子串行 是遞增,不是非遞減 用乙個樹狀陣列維護一下就ok了 include include include include include using namespace std co...
hdu5125 樹狀陣列 dp
hdu5125 他說的是n個人每個人都有兩個氣球a,b,氣球各自都有相應的體積,現在讓他們按照序號排列好來,對他們的a氣球體積值計算最長上公升子串行,對於這整個排列來說有m次機會讓你將a氣球替換成b氣球 允許不使用完 問最後的最長上公升子串行 的長度是多少,哈哈,當然用dp的思想我們很容易就能知道狀...