• 校赛 你的粪坑V2


    原题

    今天举办程序设计比赛,2点30分开始,然而你睡到了2点25分,紧张的你将头发梳成大人模样,敷上一层最贵的面膜,穿着滑板鞋,以飞一般的速度奔向计算机学院准备参加程序设计竞赛!冠军是你的!

    然而路上稍不留神,你不小心掉进了一个大粪坑,大粪坑是一个N*N的方格矩阵,每个方格存在着X坨粪,一开始你处在A[1,1]的粪坑位,你可以选择向下移动或者向右移动,目标是逃离大粪坑到达A[N,N]。

    此外!!敲重点!!每经过一个粪坑,你会触及粪量X(粗俗的说法叫做吃屎),而且每更改一次方向,传说中的粪皇会向你丢粪!!

    粪皇是个学过二进制的优雅美男子,所以他丢粪也是相当的儒雅随和。第一次他会向你丢1坨,第二次他会向你丢2坨哦,第三次他会向你丢4坨哦!第四次他会向你丢8坨哦!第五次他会向你丢16坨哦!....,第N次他会向你丢2^(N-1)坨哦!嘤嘤嘤~~~~~~~

    机智的你绝不会向粪皇低头!所以你拿起手中的笔记本,打开Codeblocks,写下#include<bits/stdc++.h>,开始计算如何掉最少的发,吃最少的屎,冲出粪坑,到达计院,拿下冠军!

    输入

    第一行是一个整数T,代表测试数据个数。

    对每个测试数据第一行是一个整数N,代表粪坑大小为N*N (1 ≤ N ≤ 100) 。

    接下来N行每行N个整数,代表粪坑矩阵A中每个粪坑位的粪量(1 ≤ Aij ≤ 100)。

    输出

    最少吃屎量

    样例输入

    1
    3 
    1 4 6 
    1 1 3 
    6 1 1
    

    样例输出

    10
    

    题解

    #include <bits/stdc++.h>
    #define min3(x, y, z) min(x, min(y, z))
    using namespace std;
    int mp[110][110];
    int dp[110][110][2][20];  //x, y, 0left 1up, k次
    int main() {
        int n, T;
        scanf("%d", &T);
        while(T--) {
            memset(mp, 0, sizeof(mp));
            memset(dp, 0x3f3f3f3f, sizeof(dp));
            scanf("%d", &n);
            for(int i = 1; i <= n; ++ i) {
                for(int j = 1; j <= n; ++ j) {
                    scanf("%d", &mp[i][j]);
                }
            }
            dp[1][1][0][0] = dp[1][1][1][0] = mp[1][1];
            for(int i = 2; i <= n; ++ i) {
                dp[1][i][0][0] = dp[1][i - 1][0][0] + mp[1][i];
                dp[i][1][1][0] = dp[i - 1][1][1][0] + mp[i][1];
            }
            for(int k = 1; k <= 15; ++ k) {
                for(int i = 2; i <= n; ++ i) {
                    for(int j = 2; j <= n; ++ j) {
                        if(k >= i || k >= j) continue;  //小剪枝。抵达i行最多只能转i - 1次方向,j列同理
                        dp[i][j][0][k] = min3(dp[i][j][0][k], dp[i][j - 1][0][k] + mp[i][j], dp[i][j - 1][1][k - 1] + (1 << k - 1) + mp[i][j]);
                        dp[i][j][1][k] = min3(dp[i][j][1][k], dp[i - 1][j][1][k] + mp[i][j], dp[i - 1][j][0][k - 1] + (1 << k - 1) + mp[i][j]);
                    }
                }
            }
            int ans = 0x3f3f3f3f;
            for(int k = 0; k <= 15; ++ k) {
                ans = min3(ans, dp[n][n][1][k], dp[n][n][0][k]);
            }
            cout << ans << endl;
        }
    }
    
  • 相关阅读:
    day15
    day13
    day12
    使用modelsim直接仿真IP(FIFO)
    整理:FPGA选型
    Quartus 中调用modelsim的流程及*.vt或*.vht自动生成
    quartus ip核破解
    LDO ,开关电源DC-DC的优缺点
    硬件工程师面试经历2015---笔试篇
    出色的硬件工程师必备的几项“硬”实力
  • 原文地址:https://www.cnblogs.com/Draymonder/p/11111162.html
Copyright © 2020-2023  润新知