P6103 [EER2]直接自然溢出啥事沒有:我語文不好,dp也不好

鏈接: P6103 [EER2]直接自然溢出啥事沒有
出題人的語文很好嗎?整篇閱讀理解給我們做!整個都搞暈了,在題解的幫助下,畫個圖理解下。

連接
+2
+0
+2+4
+2
+0+2
+2
+1
語句
片段
語句塊
函數

設:
dp[i][0]爲語句數;
dp[i][1]爲程序片段數;dp[i][1]=j=0i1dp[j][1]dp[ij][0]dp[i][1]= \sum_{j=0}^{i-1}dp[j][1]*dp[i-j][0]
dp[i][2]爲語句塊;dp[i][2]=dp[i2][1]dp[i][2]=dp[i-2][1]
dp[i][3]爲函數;dp[i][3]=dp[i2][3]+dp[i2][2]+dp[i4][2]dp[i][3]=dp[i-2][3]+dp[i-2][2]+dp[i-4][2]
dp[i][4]爲值;dp[i][4]=dp[i][3]+dp[i2][3]+dp[i2][4]dp[i][4]=dp[i][3]+dp[i-2][3]+dp[i-2][4]
dp[i][0]:dp[i][0]=dp[i][2]+dp[i1][4]dp[i][0]=dp[i][2]+dp[i-1][4]
因爲已知條件爲dp[0][1]=1;dp[1][0]=1;dp[1][1]=1;
所以長度爲0和1的語句與片段,後續循環中的的求解順序爲:語句塊dp[][2]>函數dp[][3]>值dp[][4]>語句dp[][0]>片段dp[][1];
參考代碼:

//copy tj 
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
typedef unsigned long long ull;
ull n, dp[100010][5];

int main(){
    cin>>n;
    dp[0][1] = dp[1][0] = dp[1][1] = 1;
    for(int i = 2; i <= n; ++i){//要求的是dp[][1] ;
    	dp[i][2] = dp[i - 2][1];//語句塊由判斷得來 
        dp[i][3] = dp[i - 2][2] + dp[i - 2][3];//語句塊+2,函數+2得到函數 
        if(i >= 4) dp[i][3] += dp[i - 4][2];//語句塊+2+4得到函數 
        dp[i][4] = dp[i][3] + dp[i - 2][4];//注意這裏
        dp[i][0] = dp[i][2] + dp[i - 1][4]; 
        for(int j = 0; j < i; ++j) dp[i][1] += dp[j][1] * dp[i - j][0];//根據上述情況模擬
    }
    cout<<dp[n][1]<<endl;
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章