題意:求最長下降子串行的長度,和該長度的最長下降子串行有多少個
思路:o(n^2)求最長下降子串行,統計個數時兩個狀態轉移方程一是統計個數的通用方程:if(a[i] < a[j] && dp[i] == dp[j + 1])cnt[i] += cnt[j]
另乙個是如果當前點和之前的點是相等的,且dp[i] == dp[j]那麼當前點的所有情況中一定是包括了之前點的方案數,大於等於之前的點。固清空之前點的情況,保留當前點的結果
**:
#include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std;
int a[5005];
int dp[5005];
int cnt[5005];
int main()
for(int i = 0; i a[i])
}if(dp[i] == 1)
cnt[i] = 1;
}int maxn = 0;
for(int i = 0; i < n; i ++)
printf("%d ",maxn);
for(int i = 0; i < n; i ++)
if(a[j] == a[i] &&dp[i] == dp[j])}}
int ans = 0;
for(int i = 0; i < n; i ++)
printf("%d\n",ans);
return 0;
}
POJ 1952 最長下降子串行 方案數
求最長下降子串行 簡單 就是求方案數比較麻煩點 看了別人的解題報考才懂 也對最長 子串行的理解更深一步 include include includeusing namespace std const int maxn 5005 int n int price maxn len maxn count...
最長上公升子串行,最長不下降子串行
最長上公升子串行 include includeusing namespace std const int n 23333 12 int dp n a n int n int binarysearch int k,int len else if k dp mid else mid l r 1 ret...
最長不下降子串行
a1 t0 an a an 1 2 b an c d n 1 求該序列最長不下降子串行長度 n不是很大顯然可以暴力。n很大呢?那就不斷減迴圈節長度直至減到乙個閾值內,再暴力。正確性顯然,只要閾值不要設太小。include include include define fo i,a,b for i a...