動態規劃 北郵OJ 94 最小距離查詢

2021-09-10 06:31:00 字數 3466 閱讀 2489

用set**寫了一堆自己都看不懂的**, 一提交居然ac了, 一發入魂

#include

#define ff(a,b) for(int a=0;a#define f(a,b) for(int a=1;a<=b;a++)

#define len 510000

#define inf 1000000

#define bug(x) cout<<#x<<"="namespace std;

char buf[

100010];

intmain()

while

(n--

)else

else

if(tpos.

size()

==1)else

it--

;//復原

if(it!=tpos.

begin()

)}}printf

("%d\n"

,ans);}

}}return0;

}

其實dp也簡單.

對於錄入的資料, 從左到有做如下狀態轉移:

用pre[k] 記錄 字母k最近(最靠右)出現的下標. 未出現用0代替

對字串從左到右掃瞄, 當前下標為i , 字元為k, 做判斷 :

pre[k]

= i;

//僅僅做更新

j=pre[k]

//記錄上次位置

pre[k]

= i;

//做更新

f[i]

=i-j;

//因為i是最近(右)出現的, 必然距離左邊的那個字母最近

f[j]

=min

(f[j]

,f[i]

)//而左邊的, 需要狀態轉移

歐陽巨佬**:

// #include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

typedef

long

long ll;

const

int inf =

0x3f3f3f3f

;//----------------

#define int long long

#define double long double

//----------------

#define file(s) freopen(s ".in", "r", stdin), freopen(s ".out", "w", stdout)

inline

intread()

while

(ch >=

'0'&& ch <=

'9')

return x * f;

}#define sdf(x) x=read()

#define for(i, a, b) for (int i = (a); i <= (b); i++)

#define ffor(i, a, b) for (int i = (a); i >= (b); i--)

#define me(a, b) memset(a, b, sizeof(a))

#define addmod(x, y) (x) = ((x)+ (y)) % mod

#define mulmod(x, y) (x) = (((x) % mod) * ((y) % mod)) % mod

#define chkmin(x, y) (x) = (x) <= (y) ? (x) : (y)

#define chkmax(x, y) (x) = (x) >= (y) ? (x) : (y)

#define mid ((l + ((r - l)/2)))

#define edge struct edgee[n << 1];int fi[n];int ce = 1;

#define star_link inline void add(int u, int v, int w);fi[u] = ce;}

#define qmul inline ll qmul(ll x,ll y)

#define go(u) for (int i = fi[u]; i; i = e[i].nx)

#define random(a, b) ((a) + rand() % ((b) - (a) + 1))

#define cnm cout<<"d"

#define bg1(x) cout<<(#x)<<":"<<(x)<<" "<#define bg2(x,y) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<#define bg3(x,y,z) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<#define bg4(x,y,z,w) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<<(#w)<<":"<<(w)<<" "<#define bg5(x,y,z,w,k) cout<<(#x)<<":"<<(x)<<" "<<(#y)<<":"<<(y)<<" "<<(#z)<<":"<<(z)<<" "<<(#w)<<":"<<(w)<<" "<<(#k)<<":"<<(k)<<" "#define die die++;if(die>100000)

#define lson p << 1, l, mid

#define rson p << 1 | 1, mid + 1, r

#define root 1, 1, n

const

double eps =

1e-9

;// srand((unsigned)time(null));

ll mod =

1e9+7;

const

int n =

1e6+5;

int t;

char s[n]

, ss[n]

;int q;

char c;

int n;

int f[n]

;int pre[n]

;voidwk(

int i)

}void

wk2(

int i)

pre[k]

= i;

}signed

main()

while

(q--

)else}}

}

北郵OJ打牌

牌只有1到9,手裡拿著已經排好序的牌a,對方出牌b,用程式判斷手中牌是否能夠壓過對方出牌。規則 出牌牌型有5種 1 一張 如4 則5.9可壓過 2 兩張 如44 則55,66,77,99可壓過 3 三張 如444 規則如 2 4 四張 如4444 規則如 2 5 五張 牌型只有12345 23456...

北郵OJ虛數

乙個複數 x iy 集合,兩種操作作用在該集合上 1 pop 表示讀出集合中複數模值最大的那個複數,如集合為空 輸出 empty 不為空就輸出最大的那個複數並且從集合中刪除那個複數,再輸出集合的大小size 2 insert a ib 指令 a,b表示實部和虛部 將a ib加入到集合中 輸出集合的大...

北郵OJ樹查詢

有一棵樹,輸出某一深度的所有節點,有則輸出這些節點,無則輸出empty。該樹是完全二叉樹。輸入描述 輸入有多組資料。每組輸入乙個n 1 n 1000 然後將樹中的這n個節點依次輸入,再輸入乙個d代表深度。輸出描述 輸出該樹中第d層得所有節點,節點間用空格隔開,最後乙個節點後沒有空格。示例1輸入 41...