日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

无题6

發(fā)布時間:2023/11/27 生活经验 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 无题6 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

題解:

第一題:類比只有三根,四根的柱子的漢諾塔,柱子越多越好,柱子盤子固定,步數(shù)一定,如果我有K個盤子,J個柱子,把P個盤子移到1個柱子的步數(shù)為F【P】【J】, 那么剩余K-P個盤子移到1個柱子就是F【K-P】【J-1】, 放P的柱子不能再放了,然后我們又有J個可以自由移動的柱子,

所以f[ i ][ j ] = min(f[ k ][ j ] * 2 + f[ i - k ][ j -1 ]), 枚舉k即可;

?

#include<bits/stdc++.h>
using namespace std;
long long dp[70][70];int main(){freopen("hanoi.in","r",stdin);freopen("hanoi.out","w",stdout);int n, m;scanf("%d%d", &n, &m);memset(dp, 0x3f, sizeof(dp));dp[1][3] = 1;for(int i = 2; i <= n; i++) dp[i][3] = ((dp[i - 1][3] + 1) << 1) - 1;for(int i = 1; i <= 65; i++) dp[0][i] = 0, dp[1][i] = 1, dp[2][i] = 3;for(int i = 4; i <= m; i++)for(int j = 3; j <= n; j++){for(int k = 1; k <= j; k++)dp[j][i] = min(2 * dp[j - k][i] + dp[k][i - 1], dp[j][i]);}printf("%lld\n", dp[n][m]);
}          
View Code

?

?

?

第二題:

我只想說cyj太聰明了

#include<bits/stdc++.h>
using namespace std;
const int M = 200005;
char s[M]; int b[M];
struct node{int val, id;bool operator < (const node &rhs) const{return val < rhs.val;}
}a[M];int q[M], h, t;
int main(){freopen("rank.in","r",stdin);freopen("rank.out","w",stdout);int n, fg = 0;scanf("%d", &n);char now = 'a';for(int i = 1; i <= n; i++){scanf("%d", &a[i].val), a[i].id = i; b[i] = a[i].val;}sort(a + 1, a + 1 + n);int lst = 0; a[n+1].id = -1;for(int i = 1; i <= n; i++){node p; p.val = i;int pos = lower_bound(a + 1, a + 1 + n, p) - a;if(b[a[pos].id + 1] > lst) s[a[pos].id] = now;else s[a[pos].id] = ++now;lst = b[a[pos].id + 1];if(now > 'z'){fg = -1;break;}}if(fg)puts("-1");else for(int i = 1; i <= n; i++)printf("%c", s[i]);
} 
View Code

?

第三題:期望DP,以前講過, 終于還是寫了這道題

F化簡:f(u) = sum ( f(v) ) + deg(u) , ?v is u's child

G化簡:g(u) = g(fa(u)) + f(fa(u)) - f(u);

注意求完f,然后用f更新g, 修改f[ 1 ] = 0, ?因?yàn)?不會再往上走,但更新g之前不能改F1,是有實(shí)際有意的;

#include<bits/stdc++.h>
using namespace std;
#define ex(i, u) for(int i = h[u]; i; i = G[i].nxt)
const int mod = 1e9 + 7, M = 1e5 + 5;
int P = 20, f[M], g[M], F[M], GV[M], dep[M], deg[M], anc[M][25], h[M], tot;
struct edge{int nxt, v;}G[M<<1];
void add(int u, int v){G[++tot].v = v, G[tot].nxt = h[u], h[u] = tot;}
inline int moc(int a){return a >= mod ? a - mod : a;}
void dfs1(int u, int fa){anc[u][0] = fa;for(int p = 1; p <= P; p++)anc[u][p] = anc[anc[u][p - 1]][p - 1];ex(i, u){int v = G[i].v;if(v == fa)continue;dfs1(v, u);f[u] = moc(f[u] + f[v]);}f[u] = moc(f[u] + deg[u]);
}void dfs2(int u, int fa){dep[u] = dep[fa] + 1;    F[u] = moc(F[fa] + f[u]);GV[u] = moc(GV[fa] + g[u]);ex(i, u){int v = G[i].v;if(v == fa)continue;g[v] = (g[u] + f[u] - f[v] + mod) % mod;dfs2(v, u);}
}int get(int u, int v){if(dep[u] < dep[v])swap(u, v);int t = dep[u] - dep[v];for(int p = 0; t; t >>= 1, p++)if(t & 1) u = anc[u][p];if(u == v) return u;for(int p = P; p >= 0; p--)if(anc[u][p] != anc[v][p])u = anc[u][p], v = anc[v][p];return anc[u][0];
}int main(){freopen("tree.in","r",stdin);freopen("tree.out","w",stdout);int n, q, u, v;scanf("%d%d", &n, &q);for(int i = 1; i < n; i++){scanf("%d%d", &u, &v);add(u, v); add(v, u);deg[u]++; deg[v]++;}dfs1(1, 0);F[0] = -f[1];dfs2(1, 0);//for(int i = 1; i <= n; i++)printf("%d %d %d %d %d\n", i, f[i], g[i], F[i], GV[i]);f[1] = 0;while(q--){scanf("%d%d", &u, &v);int lca = get(u, v), flca = anc[lca][0];int ans = ( (F[u] - F[lca] + GV[v] - GV[lca]) % mod + mod ) % mod;printf("%d\n", ans);}
}
View Code

?

轉(zhuǎn)載于:https://www.cnblogs.com/EdSheeran/p/9690767.html

總結(jié)

以上是生活随笔為你收集整理的无题6的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。