zoj 2900 DP(線段樹優化)

2021-06-21 12:07:46 字數 2263 閱讀 2758

同樣是暴力,別人能過,我不能過,生活有的時候就是這麼無奈。

dp【i】【j】【k】表示前i個數取j個,最後一和是k的個數

然後改變dp順序可以將三維變為2維

注意下一下細節的地方。。。。不然這樣暴力dp會超時

還有一種就是用線段樹來優化。。。。。優化到3770ms。。。。。

不優化是6000+ms。。。。

有一點要注意的就是不能乙個都沒有。。。

ac**如下:

線段樹優化:

#include #include #include #include using namespace std;

int dp[2200][110];

int n, k, p, m;

int num[2200];

int now;

int sum[2200][1000];

int lc( int root )

int rc( int root )

void up( int pos, int root )

void updata( int pos, int k, int number, int l, int r, int root )

int mid = ( l + r ) / 2;

if( k <= mid ) updata( pos, k, number, l, mid, lc( root ) );

else updata( pos, k, number, mid + 1, r, rc( root ) );

up( pos, root );

}int query( int pos, int l, int r, int l, int r, int root )

int ans = 0;

int mid = ( l + r ) / 2;

if( l <= mid ) ans = ( ans + query( pos, l, r, l, mid, lc( root ) ) ) % m;

if( r >= mid + 1 ) ans = ( ans + query( pos, l, r, mid + 1, r, rc( root ) ) ) % m;

return ans % m;

}int main()

memset( dp, 0, sizeof( dp ) );

memset( sum, 0, sizeof( sum ) );

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

int temp = 0, a, b;

a = num[i] - p;

if( a < ttmin ) a = ttmin;

b = num[i] + p;

if( b > ttmax ) b = ttmax;

temp = query( j - 1, a, b, 0, 100, 1 );

dp[j][num[i]] = ( dp[j][num[i]] + temp ) % m;

updata( j, num[i], dp[j][num[i]], 0, 100, 1 );}}

int ans = 0;

for( int i = k == 0 ? 1 : k; i <= n; i++ )

// if( k == 0 ) ans = ( ans + 1 ) % m;

cout << ans << endl;

}return 0;

}

沒用線段樹優化的話要注意一些細節。。。。

#include #include #include #include using namespace std;

int dp[2200][110];

int n, k, p, m;

int num[2200];

int now;

int main()

memset( dp, 0, sizeof( dp ) );

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

dp[j][num[i]] = ( dp[j][num[i]] + temp ) % m;

}dp[1][num[i]]++;

}int ans = 0;

for( int i = k == 0 ? 1 : k; i <= n; i++ )

}// if( k == 0 ) ans++;

cout << ans << endl;

}return 0;

}

線段樹優化dp

等離子炮有n個操作訊號,第i個操作訊號的強度為b i 總體強度為各操作訊號的強度之和。由於有些訊號太弱了了 強度 0 水寶寶想把它們刪除。但是水寶寶自己不會刪除訊號,所以他找來了同船的隊友幫忙。有 m位隊友,第ii 位隊友只會刪除編號在 l i 和 r i 之間的訊號,且每刪除乙個訊號,花費 c i...

降臨(線段樹優化dp)

選定點i會有代價 c i 如果乙個區間j內的點全被選擇,就可以獲得回報 p j 點數和區間個數 1e5 還以為是線段樹優化網路流 50萬個點200萬條邊看上去很可做的樣子畢竟lbn說過網路流20萬萬條邊完全沒問題 沒想到是個線段樹dp。雖然這兩個線段樹完全扯不上關係 用 f i j 表示考慮到第i個...

線段樹優化DP之Monotonicity

定義f i 為處理到第i位,所得匹配的最長長度,根據f i 我們可以求出它後面要跟的符號 可以用符號填滿,避免一些取模運算 對於i,我們列舉每乙個i前面的j,判斷是否合法,那麼 n 2 的做法就可以寫出來了 includeusing namespace std const int maxn 2000...