hihoCoder 編程練習(xí)賽57

題目鏈接戳這里
整理3道小題立刻睡了兑宇。

1-偏差排列

時間限制:10000ms
單點(diǎn)時限:1000ms
內(nèi)存限制:256MB
描述
如果一個1~N的排列P=[P1, P2, ... PN]中的任意元素Pi都滿足|Pi-i| ≤ 1,我們就稱P是1-偏差排列。
給定一個N扒披,請你計算一共有少個不同的排列是1-偏差排列。
例如對于N=3颖侄,有3個1-偏差排列:[1, 2, 3], [1, 3, 2], [2, 1, 3]萄凤。
輸入
一個整數(shù)N。
對于50%的數(shù)據(jù)妒穴,1 ≤ N ≤ 15
對于100%的數(shù)據(jù)宋税,1 ≤ N ≤ 50
輸出
一個整數(shù)表示答案
樣例輸入 3 樣例輸出 3

分析:由于要滿足|pi-i|<=1,考慮已有一個長度為n-1的“1-偏差排列”讼油,插入第n個數(shù)字時杰赛,我們可以發(fā)現(xiàn)只有第n和第n-1個位置是符合條件的。記n個數(shù)的1-偏差排列數(shù)量為f(n)矮台,放第n個位置乏屯,排列有f(n-1)種,放第n-1個位置瘦赫,排列有f(n-2)種(第n-1個數(shù)被固定死在第n個位置)辰晕,所以是斐波那契數(shù)列,用數(shù)組遞推/矩陣方法都行确虱。小心最后int越界含友。

遞增N元組

時間限制:10000ms
單點(diǎn)時限:1000ms
內(nèi)存限制:256MB
描述
給定N個數(shù)組,每個數(shù)組都包含M個整數(shù)校辩。
現(xiàn)在你被要求從每個數(shù)組中選出一個數(shù)窘问,總共N個數(shù)。
在MN種選法中宜咒,有多少種選法滿足選出的N個數(shù)恰好是嚴(yán)格遞增的惠赫?
樣例中有5種選法:{1, 3, 4}, {1, 3, 9}, {1, 5, 9}, {1, 7, 9}, {6, 7, 9}
輸入

第一行包含兩個整數(shù)N和M。
以下N行荧呐,每行包含M個整數(shù)汉形。
對于50%的數(shù)據(jù),1 ≤ N, M ≤ 100
對于100%的數(shù)據(jù)倍阐,1 ≤ N ≤ 100 M ≤ 10000 0 ≤ 每個整數(shù) ≤ 100000
輸出
由于答案可能非常大概疆,你只需要輸出答案模1000000007的余數(shù)。
樣例輸入
3 3
8 1 6
3 5 7
4 9 2
樣例輸出 5

分析:
動手畫一下“樹狀圖”峰搪,可知是DFA求葉子節(jié)點(diǎn)值之和岔冀,考慮用dp遞推。i和j都從1開始計數(shù)概耻,令dp[i][j]是:到第i號數(shù)組使套,取第j個元素時的取法數(shù)罐呼。那么答案將是∑dp[N][j],其中j∈[1,M]侦高。
元素elements嫉柴,i號數(shù)組j元素我放在e[i][j]中,那么dp[i][j] = ∑dp[i-1][k]奉呛,其中k是e[i-1]數(shù)組中计螺,嚴(yán)格小于e[i][j]的元素個數(shù)。簡單來分析就是:要取到第i個數(shù)組的j元素瞧壮,那么到這兒的取法總數(shù)就是到上一個數(shù)組時登馒,比j嚴(yán)格小的元素的取法的和。但是到第i個數(shù)組咆槽,每個j元素都去查詢有多少個比自己小的(設(shè)為k個)陈轿,然后從第1項開始求這k項和會超時!我們先給元素都排個序秦忿。假設(shè)e[i-1]數(shù)組中比e[i][j-1]小的有k"個麦射,比e[i][j]小的有k個,那么e[i-1]中前k"項當(dāng)然也小于e[i][j]小渊,這部分的和無需重復(fù)求法褥,dp[i][j] = dp[i][j-1],dp[i][j]再加上k"項后仍需的那k-k"項即可酬屉。

另外有個小tips:平時喜歡數(shù)組從0開始數(shù)半等,但在dp時,用1開始往往能更順心地去“一般化邊界情況”呐萨,建議從1開始杀饵,留下點(diǎn)空間來初始化。最終代碼:

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
const int maxN = 1e2 + 5, maxM = 1e4 + 5;
const int mod = 1e9 + 7;
int N, M, T;
int e[maxN][maxM];
int dp[maxN][maxM];

int main() {
    scanf("%d%d", &N, &M);
    dp[0][1] = 1;
    rep(i, 1, N + 1) {
        rep(j, 1, M + 1) {
            scanf("%d", &e[i][j]);
        }
        sort(e[i] + 1, e[i] + M + 1);
        int k = 0;
        rep(j, 1, M + 1) {
            dp[i][j] = dp[i][j - 1];
            while (k <= M && e[i - 1][k] < e[i][j]) {
                dp[i][j] = (dp[i][j] + dp[i - 1][k]) % mod;
                ++k;
            }
        }
    }
    int ans = 0;
    rep(j, 1, M + 1)
        ans = (ans + dp[N][j]) % mod;
    printf("%d", ans);
    return 0;
}
逃離迷宮5

時間限制:10000ms
單點(diǎn)時限:1000ms
內(nèi)存限制:256MB
描述
小Hi被壞女巫抓進(jìn)里一間有N × N個格子組成的矩陣迷宮谬擦。
有些格子是小Hi可以經(jīng)過的切距,我們用'.'表示;有些格子上有障礙物小Hi不能經(jīng)過惨远,我們用'#'表示谜悟。小Hi的起始位置在左上角,他需要到達(dá)右下角的格子才能逃離迷宮北秽。小Hi每一步可以移動到上下左右四個方向相鄰的格子上葡幸,前提是目標(biāo)格式必須是沒有障礙的。
現(xiàn)在小Hi可以用魔法移除一個格子上的障礙贺氓,也就是'#'變成'.'蔚叨,使其可以經(jīng)過。
請你計算在只能移除一處障礙的情況下,小Hi最少移動多少步可以逃離迷宮蔑水。
輸入
第一行包含一個整數(shù)N邢锯。
以下N行包含一個N × N的矩陣。
矩陣保證左上角和右下角是'.'搀别。
對于70%的數(shù)據(jù)丹擎,1 ≤ N ≤ 100
對于100%的數(shù)據(jù),1 ≤ N ≤ 1000
輸出
一個整數(shù)表示答案领曼。如果小Hi不能逃離迷宮鸥鹉,輸出-1蛮穿。
樣例輸入
4
.#..
#.#.
.##.
.#..
樣例輸出
6

這道題...有細(xì)節(jié)容易忽略庶骄。方法是:首先bfs還是比較容易確定的,然后遇到墻的時候践磅,如果本就可以走单刁,那便走,不可走府适,考慮用魔法羔飞,用了的話,自己包括以后自己擴(kuò)展的節(jié)點(diǎn)都要留下記錄檐春,防止再用逻淌。
注意2個地方:
一個是若是可直接走,驗(yàn)證的是vis[nx][ny][cur.q]疟暖,即根據(jù)cur節(jié)點(diǎn)來判斷是要修改“用了魔法的狀態(tài)”或者“沒用的”卡儒,這里很容易忽略,以為是平地俐巴,應(yīng)該判斷vis[nx][ny][0]的情況骨望,其實(shí)也有可能是用了魔法之后到平地的呀!

#include <iostream>
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define mst(a,b) memset(a,b,sizeof(a))
#define rep(i,a,b) for(ll i=(a);i<(b);++i)
const int inf = 0x3f3f3f3f, maxN = 1e4 + 5;
int N, M, T;
char G[maxN][maxN];
// vis數(shù)組vis[i][j][k],k0是未用魔法的 1是用了的
bool vis[maxN][maxN][2];

int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
// x和y坐標(biāo)欣舵,q:1/0表示是/否破過墻,cnt是步數(shù)
struct Node {
    int x, y, q, cnt;
    Node(int a, int b, int c, int d)
        : x(a), y(b), q(c), cnt(d) {}
};

void bfs() {
    mst(vis, 0);
    queue<Node> Q;
    Q.push(Node(0, 0, 0, 0));
    vis[0][0][0] = vis[0][0][1] = 1;

    int ans = -1;
    while (!Q.empty()) {
        Node cur = Q.front(); Q.pop();
        if (cur.x == N - 1 && cur.y == N - 1) {
            ans = cur.cnt;
            break;
        }

        rep(d, 0, 4) {
            int nx = cur.x + dx[d], ny = cur.y + dy[d];
            if (0 <= nx && nx < N && 0 <= ny && ny < N) {
                bool *vi = vis[nx][ny];
                if (!vi[cur.q] && G[nx][ny] == '.') {
                    vi[cur.q] = 1;
                    Q.push(Node(nx, ny, cur.q, cur.cnt + 1));
                } else if (!vi[1] && G[nx][ny] == '#' && cur.q == 0) {
                    vi[1] = 1;
                    Q.push(Node(nx, ny, 1, cur.cnt + 1));
                }
            }
        }
    }
    printf("%d\n", ans);
}

int main() {
    // freopen("data.in", "r", stdin);
    scanf("%d", &N);
    rep(i, 0, N)
        scanf("%s", G[i]);
    bfs();
    return 0;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末擎鸠,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子缘圈,更是在濱河造成了極大的恐慌劣光,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,383評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糟把,死亡現(xiàn)場離奇詭異绢涡,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)糊饱,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,522評論 3 385
  • 文/潘曉璐 我一進(jìn)店門垂寥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事滞项∠凉椋” “怎么了?”我有些...
    開封第一講書人閱讀 157,852評論 0 348
  • 文/不壞的土叔 我叫張陵文判,是天一觀的道長过椎。 經(jīng)常有香客問我,道長戏仓,這世上最難降的妖魔是什么疚宇? 我笑而不...
    開封第一講書人閱讀 56,621評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮赏殃,結(jié)果婚禮上敷待,老公的妹妹穿的比我還像新娘。我一直安慰自己仁热,他們只是感情好榜揖,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,741評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著抗蠢,像睡著了一般举哟。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上迅矛,一...
    開封第一講書人閱讀 49,929評論 1 290
  • 那天妨猩,我揣著相機(jī)與錄音,去河邊找鬼秽褒。 笑死壶硅,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的震嫉。 我是一名探鬼主播森瘪,決...
    沈念sama閱讀 39,076評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼票堵!你這毒婦竟也來了扼睬?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,803評論 0 268
  • 序言:老撾萬榮一對情侶失蹤悴势,失蹤者是張志新(化名)和其女友劉穎窗宇,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體特纤,經(jīng)...
    沈念sama閱讀 44,265評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡军俊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,582評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了捧存。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片粪躬。...
    茶點(diǎn)故事閱讀 38,716評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡担败,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出镰官,到底是詐尸還是另有隱情提前,我是刑警寧澤,帶...
    沈念sama閱讀 34,395評論 4 333
  • 正文 年R本政府宣布泳唠,位于F島的核電站狈网,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏笨腥。R本人自食惡果不足惜拓哺,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,039評論 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望脖母。 院中可真熱鬧士鸥,春花似錦、人聲如沸镶奉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,798評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽哨苛。三九已至,卻和暖如春币砂,著一層夾襖步出監(jiān)牢的瞬間建峭,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,027評論 1 266
  • 我被黑心中介騙來泰國打工决摧, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留亿蒸,地道東北人。 一個月前我還...
    沈念sama閱讀 46,488評論 2 361
  • 正文 我出身青樓掌桩,卻偏偏與公主長得像边锁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子波岛,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,612評論 2 350

推薦閱讀更多精彩內(nèi)容

  • 計算機(jī)二級C語言上機(jī)題庫(南開版) 1.m個人的成績存放在score數(shù)組中茅坛,請編寫函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,335評論 1 42
  • 動態(tài)規(guī)劃(Dynamic Programming) 本文包括: 動態(tài)規(guī)劃定義 狀態(tài)轉(zhuǎn)移方程 動態(tài)規(guī)劃算法步驟 最長...
    廖少少閱讀 3,270評論 0 18
  • 前幾天爸爸媽媽來重慶看我,因?yàn)楣ぷ鞯脑驔]有能好好陪他們则拷。今晚他們就要離開贡蓖,突然很舍不得。這是媽媽第一次坐飛機(jī)煌茬,說...
    心光微瀾閱讀 317評論 4 2
  • 此刻斥铺,緊閉的不僅是門窗還有關(guān)于塵世斑斕的記憶黑夜有摧枯拉朽之力掩蓋所有虛假的光芒 你常常在深夜醒來對空洞的四周喊:...
    風(fēng)之子的黃昏閱讀 369評論 14 18
  • 文/柯臨 一晾蜘、同樣算時薪邻眷,才發(fā)現(xiàn)差別那么大 最近我有點(diǎn)兒膨脹(嗯,是真的膨脹)剔交,擔(dān)心再下去有胖若兩人的危險耗溜,就尋思...
    臨公子的后花園閱讀 1,460評論 2 41