国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Peter算法小課堂—線性dp

這篇具有很好參考價(jià)值的文章主要介紹了Peter算法小課堂—線性dp。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

今天,你讀完這篇文章,普及組的動(dòng)態(tài)規(guī)劃已經(jīng)可以秒了。

最長(zhǎng)公共子序列

求兩個(gè)數(shù)列的最長(zhǎng)公共子序列(Longest Common Subsequence,LCS)的長(zhǎng)度。

數(shù)列 X?和 Y?的最長(zhǎng)公共子序列 Z,是指 Z?既是 X?的子序列,又是 Y?的子序列,而且任意長(zhǎng)度超過(guò) Z?的數(shù)列 Z??都不符合這個(gè)性質(zhì)。

狀態(tài)定義

f[i][j]表示x[1]、x[2]……x[i]和y[1]、y[2]……y[j]的LCS

狀態(tài)轉(zhuǎn)移方程

若x[i]=y[j],f[i][j]=f[i-1][j-1]+1;

若x[i]!=y[j],f[i][j]=max(f[i-1][j],f[i][j-1]);

Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

大家可以用滾動(dòng)數(shù)組試試

回文詞

給定一個(gè)字符串,問(wèn)至少需要增加多少個(gè)字符,才能把這個(gè)字符串變成回文詞。一個(gè)字符串是回文詞,是指從前往后看和從后往前看是一樣的。比如:abcba、abccba、bcaacb都是回文詞,但 abc?不是回文詞。

這道題是前一道題的衍生。

假設(shè)給定的字符串為s,將s反轉(zhuǎn),得到t。那么,答案就是:s長(zhǎng)度-s和t的LCS。這里就不給代碼了

最長(zhǎng)上升子序列

樸素解法

f[i]表示以i結(jié)尾的最長(zhǎng)上升子序列的長(zhǎng)度

按照倒數(shù)第二個(gè)選誰(shuí)分類:

我們先掃描i號(hào)元素前的每個(gè)元素(正向),找出第一個(gè)比i號(hào)元素小的元素k號(hào)。①仍然選i號(hào)元素,f[i]。②選k號(hào),f[k]+1

但是,這種解法時(shí)間復(fù)雜度為O(N^2),一但長(zhǎng)度到200,就會(huì)扣分,我們這次就討論O(nlog n)的算法。

優(yōu)化解法

不升子序列最小劃分?jǐn)?shù)

我們用貪心解決這個(gè)問(wèn)題。定義d[i]為第i條不升子序列的最后一個(gè)數(shù),cnt代表有幾個(gè)子序列

我們先掃描每個(gè)數(shù)字x[i],再枚舉每一個(gè)子序列,判斷是否能接在某個(gè)子序列后,如果不行,則新增一個(gè)序列即可。

#include <bits/stdc++.h>
#define N 1005
using namespace std;
int n,i,j,d[N],x[N];
int main(){
	cin>>n;
	for(int i=0;i<n;i++) cin>>x[i];
	int cnt=0;
	for(i=0;i<n;i++){
		for(j=0;j<cnt;j++)
			if(d[j]>=x[i]) break;
		d[j]=x[i];
		if(j==cnt) cnt++;
	}
	cout<<cnt<<endl;
	return 0;
}

O(N^2)的算法,顯然要優(yōu)化

不妨試試二分

#include <bits/stdc++.h>
#define N 1005
#define INF 2e9
using namespace std;
int n,d[N],x[N];
int main(){
	cin>>n;
	for(int i=0;i<n;i++) cin>>x[i];
	fill(d,d+n,INF);
	for(i=0;i<n;i++)
		*lower_bound(d,d+n,x[i])=x[i];
	int cnt=lower_bound(d,d+n,INF)-d;
	cout<<cnt<<endl;
	return 0;
}

大家可能就納悶了:這玩意和LIS有神馬關(guān)系???

Dilworth反鏈

Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

LIS為最長(zhǎng)子序列, 那么說(shuō)明一定能找到LIS個(gè)數(shù),從左往右是遞增的。那么這些樹一定不能放在同一組內(nèi),不然與不升矛盾。到目前為止,每個(gè)數(shù)單獨(dú)為一組,已經(jīng)開了LIS組了。說(shuō)明任何一種滿足要求的分組,組數(shù)都>=LIS。

這一下子,LIS算法就從O(N^2)降到了O(NlogN)

航線問(wèn)題

Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

這道題是上一道題的衍生。

設(shè)第1行第i個(gè)點(diǎn)對(duì)應(yīng)第2行第f[i]個(gè)點(diǎn)。假設(shè)i<j,則兩條線(i,f[i])和(j,f[j])不相交的充要條件是f[i]<f[j],于是問(wèn)題變?yōu)榍骹的LIS了,這里就不發(fā)代碼了。

兩個(gè)排列的LCS

Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

我們可以把兩個(gè)排列作相同的置換。如p1:1 5 3 2 4變成1 2 3 4 5,即做置換5→2,2→4,4→5,

于是我們可以將p1置換成1 2 ……n,p2做相同的置換,則問(wèn)題就變?yōu)長(zhǎng)IS了,時(shí)間復(fù)雜度O(N^2)

擺花

原題鏈接:P1077 [NOIP2012 普及組] 擺花 - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn)

我們可以把問(wèn)題抽象化:有?n?個(gè)數(shù)(c1?,c2?,...,cn?),0?ci??ai?,求有多少種方案數(shù)使

就變成經(jīng)典dp了,Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

然后可以使用前綴和優(yōu)化

乘積最大

原題鏈接:P1018 [NOIP2000 提高組] 乘積最大 - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn)

這道題,我只給代碼,大家自己思考一下

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
long long f[45][60];
string in;
int n,k;//n位數(shù)  k個(gè)乘號(hào) 
long long g[45];
long long cut(int l,int r){
    long long end = 0;
    for(int i = l;i <= r;i++)
        end = end * 10 + g[i];
    return end;
}
int main(){
    cin >> n >> k >> in;
    for(int i = 1;i <= n;i++)
        g[i] = in[i - 1] - '0';
    for(int i=1;i<=n;i++)
        f[i][0] = cut(1,i);
    for(int i = 2;i <= n;i++){ //枚舉分割為前i位數(shù)字 
        for(int a = 1;a <= min(i-1,k);a++){ //枚舉有幾個(gè)乘號(hào) 
            for(int b = a;b < i;b++){ //在第幾位放乘號(hào) 
                 f[i][a] = max(f[i][a],f[b][a-1] * cut(b + 1,i));
            }
        }
    }
    cout<<f[n][k];
    return 0;
}

反逆序?qū)?wèn)題

給定 n,k,求在所有長(zhǎng)度為 n的排列中,有多少排列的逆序?qū)η『脼?k?。

給出表答(懶得打LateX)

Peter算法小課堂—線性dp,CSP-J一等獎(jiǎng)高分沖刺,動(dòng)態(tài)規(guī)劃,建模,算法,動(dòng)態(tài)規(guī)劃

#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int Maxn=10100;
const ll Mod=1e9+7;
int n,k;
ll f[Maxn],sm[Maxn];

int main(){
    scanf("%d%d",&n,&k);

    f[0]=1;
    for(int i=1;i<=n;i++){
        sm[0]=f[0];
        for(int j=1;j<=k;j++) sm[j]=(sm[j-1]+f[j])%Mod;
        for(int j=0;j<=k;j++){
            if(i>j) f[j]=sm[j];
            else f[j]=(sm[j]-sm[j-i]+Mod)%Mod;
        }
    }
    printf("%lld",f[k]);

    return 0;
}

今天的題目就是這么簡(jiǎn)單,祝大家早日AC

彩蛋

給定一個(gè)十進(jìn)制整數(shù)?n,保證?n?的首位不為?00,你必須刪除其中?d?個(gè)數(shù)字,使得留下的數(shù)字最大。請(qǐng)輸出留下的最大數(shù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-855980.html

到了這里,關(guān)于Peter算法小課堂—線性dp的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • Peter算法小課堂—自定義容器

    Peter算法小課堂—自定義容器

    這個(gè)算法復(fù)雜度為O(nm),顯然有更快的算法 ?但是,這樣寫有個(gè)很危險(xiǎn)的錯(cuò)誤,如下 運(yùn)行出來(lái)是這樣的, ?原因很簡(jiǎn)單,因?yàn)閟et的功能是排序、去重,然而結(jié)構(gòu)體排序要加上“.\\\",所以會(huì)報(bào)錯(cuò) 改后代碼, 那么,回到原題,代碼該怎么寫呢? 當(dāng)然這個(gè)代碼也有高級(jí)版,但要升

    2024年02月04日
    瀏覽(21)
  • Peter算法小課堂—貪心與二分

    Peter算法小課堂—貪心與二分

    題目描述: 有n輛車大甩賣,第i輛車售價(jià)a[i]元。有m個(gè)人帶著現(xiàn)金來(lái)申請(qǐng)購(gòu)買,第i個(gè)到現(xiàn)場(chǎng)的人帶的現(xiàn)金為b[i]元,只能買價(jià)格不超過(guò)其現(xiàn)金額的車子。你是大賣場(chǎng)總經(jīng)理,希望將車和買家盡量多地進(jìn)行一對(duì)一配對(duì),請(qǐng)問(wèn)最多賣出多少輛車? 貪心法模板: 比如說(shuō):每次挑最便

    2024年02月02日
    瀏覽(21)
  • Peter算法小課堂—拓?fù)渑判蚺c最小生成樹

    Peter算法小課堂—拓?fù)渑判蚺c最小生成樹

    講拓?fù)渑判蚯?,我們要先了解什么是DAG樹。所謂DAG樹,就是指“有向無(wú)環(huán)圖”。請(qǐng)判斷下列圖是否是DAG圖 第一幅圖,它不是DAG圖,因?yàn)樗纬闪艘粋€(gè)環(huán)。第二幅圖,它也不是DAG圖,因?yàn)樗鼪](méi)有方向。第三幅圖才叫真正的DAG圖(DAG圖不一定聯(lián)通)。 那什么叫DAG圖的拓?fù)渑判蚰?/p>

    2024年01月21日
    瀏覽(20)
  • 備考CSP-J—貪心

    額……既然是備考,那么一定要?jiǎng)幽X筋,一共5題,大家好好思考一下。 一:P1250 種樹 - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn) 二:P1020 [NOIP1999 提高組] 導(dǎo)彈攔截 - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn)? 三:P1230 智力大沖浪 - 洛谷 | 計(jì)算機(jī)科學(xué)教育新生態(tài) (luogu.com.cn)?

    2024年01月25日
    瀏覽(23)
  • 2023CSP-J題解

    煩死了,這次CSP考的真的垃圾,犯了好多低級(jí)錯(cuò)誤。 小 Y 的桌子上放著 n n n 個(gè)蘋果從左到右排成一列,編號(hào)為從 1 1 1 到 n n n 。 小苞是小 Y 的好朋友,每天她都會(huì)從中拿走一些蘋果。 每天在拿的時(shí)候,小苞都是從左側(cè)第 1 1 1 個(gè)蘋果開始、每隔 2 2 2 個(gè)蘋果拿走 1 1 1 個(gè)蘋果。

    2024年02月08日
    瀏覽(19)
  • [CSP-J 2022] 解密

    大家好,今天我來(lái)解題[CSP-J 2022] 解密 題目來(lái)源鏈接 題目描述 給定一個(gè)正整數(shù) k k k ,有 k k k 次詢問(wèn),每次給定三個(gè)正整數(shù) n i , e i , d i n_i, e_i, d_i n i ? , e i ? , d i ? ,求兩個(gè)正整數(shù) p i , q i p_i, q_i p i ? , q i ? ,使 n i = p i × q i n_i = p_i times q_i n i ? = p i ? × q i ? 、 e

    2024年02月08日
    瀏覽(26)
  • 2022 CSP-J 復(fù)賽題解

    【題目描述】 小文同學(xué)剛剛接觸了信息學(xué)競(jìng)賽,有一天她遇到了這樣一個(gè)題:給定正整數(shù) a 和 b ,求 a b 的值是多少。 a b 即 b 個(gè) a 相乘的值,例如 23 即為 3 個(gè) 2 相乘,結(jié)果為 2 × 2 × 2 = 8。 “簡(jiǎn)單!”小文心想,同時(shí)很快就寫出了一份程序,可是測(cè)試時(shí)卻出現(xiàn)了錯(cuò)誤。 小文

    2024年02月07日
    瀏覽(23)
  • 2022CSP-J2題解

    今天(2022,10,29), C S P ? J S CSP-JS C S P ? J S 第二輪成功舉辦, 雖然大部分省市疫情取消 本蒟蒻今天有幸參加CSP,特發(fā)入門組題解 小文同學(xué)剛剛接觸了信息學(xué)競(jìng)賽,有一天她遇到了這樣一個(gè)題:給定正整數(shù) a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 個(gè) a a a 相乘

    2023年04月08日
    瀏覽(39)
  • 2022CSP-J 題解[完整版]

    “西西弗”的腦子是被宇宙射線影響了嗎,造的題目我都寫到睡著了…… 題目描述 小文同學(xué)剛剛接觸了信息學(xué)競(jìng)賽,有一天她遇到了這樣一個(gè)題:給定正整數(shù) a a a 和 b b b ,求 a b a^b a b 的值是多少。 a b a^b a b 即 b b b 個(gè) a a a 相乘的值,例如 2 3 2^3 2 3 即為 3 3 3 個(gè) 2 2 2 相乘,

    2024年02月10日
    瀏覽(74)
  • CSP-J/S——初賽復(fù)習(xí)(未完)

    CSP-J/S——初賽復(fù)習(xí)(未完)

    廢話不多說(shuō),馬上開始。 還是說(shuō)一點(diǎn)吧:個(gè)人認(rèn)為《信息學(xué)奧賽一本通——初賽篇》里有些廢話,不夠精煉,CSP-J/S重點(diǎn)不夠突出, 本人想將知識(shí)整理起來(lái),并總結(jié)提煉 ,以便備考以及復(fù)習(xí)。 本文參考了《信息學(xué)奧賽一本通——初賽篇》,是對(duì)它一個(gè)整理、總結(jié)與簡(jiǎn)化。

    2024年02月10日
    瀏覽(19)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包