校賽 你的糞坑V2

原題

今天舉辦程序設計比賽,2點30分開始,然而你睡到了2點25分,緊張的你將頭髮梳成大人模樣,敷上一層最貴的面膜,穿着滑板鞋,以飛通常的速度奔向計算機學院準備參加程序設計競賽!冠軍是你的!c++

然而路上稍不留神,你不當心掉進了一個大糞坑,大糞坑是一個N*N的方格矩陣,每一個方格存在着X坨糞,一開始你處在A[1,1]的糞坑位,你能夠選擇向下移動或者向右移動,目標是逃離大糞坑到達A[N,N]。測試

此外!!敲重點!!每通過一個糞坑,你會觸及糞量X(粗俗的說法叫作吃屎),並且每更改一次方向,傳說中的糞皇會向你丟糞!!spa

糞皇是個學過二進制的優雅美男子,因此他丟糞也是至關的儒雅隨和。第一次他會向你丟1坨,第二次他會向你丟2坨哦,第三次他會向你丟4坨哦!第四次他會向你丟8坨哦!第五次他會向你丟16坨哦!....,第N次他會向你丟2^(N-1)坨哦!嚶嚶嚶~~~~~~~設計

機智的你毫不會向糞皇低頭!因此你拿起手中的筆記本,打開Codeblocks,寫下#include<bits/stdc++.h>,開始計算如何掉最少的發,吃最少的屎,衝出糞坑,到達計院,拿下冠軍!code

輸入

第一行是一個整數T,表明測試數據個數。blog

對每一個測試數據第一行是一個整數N,表明糞坑大小爲N*N (1 ≤ N ≤ 100) 。it

接下來N行每行N個整數,表明糞坑矩陣A中每一個糞坑位的糞量(1 ≤ Aij ≤ 100)。程序設計

輸出

最少吃屎量class

樣例輸入

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;
    }
}
相關文章
相關標籤/搜索