C. Zero Path

 给你一个矩阵,矩阵中每个点是1或者-1,问你是否存在一条路径从左上角到右下角路径上所经过点的总和是0。

类似于数字三角型,dp[i][j]可以用dp[i-1][j]的位置 和 dp[i][j-1]的位置传递过来,我们可以保存每个位置可以达成的和的所有可能性,那么如果当前位置是1,左边一个位置的所有可行的解+1即为当前位置可行的解,当前是-1则左边一个位置的所有可行解-1即为当前位置可行解.两者取并集即可传递。我们可以用bitset来储存当前位置所有可达成路径和(每一个位置代表一种路径和可能,1即为走到当前位置存在该路径和,0则为没有)通过左移右移可以实现低复杂度的转移(除以32)。另外超过正负(n+m-1)/2的路径和不可能产生正确答案,所以我们的bitset开2000即可,超出部分不影响正确答案,也就不用保存。复杂度 O(N*M*2000/32)

ACcode

#include<bits/stdc++.h>
// #define int long long
#define endl '\n'

using namespace std;



typedef pair<int, int> PII;
const int N = 2e5 + 10;

void solve() {
    int n, m;
    cin >> n >> m;
    vector<vector<int>>a(n + 1, vector<int>(m + 1));
    vector<vector<bitset<2010>>>f(n + 2, vector <bitset<2010>>(m + 2));
    for (int i = 1;i <= n;i++)
        for (int j = 1;j <= m;j++)cin >> a[i][j];
    if (a[1][1] == 1)f[1][1][1001] = 1;
    else f[1][1][999] = 1;
    for (int i = 1;i <= n;i++) {
        for (int j = 1;j <= m;j++) {
            if (a[i][j] == 1) {
                f[i][j] |= (f[i - 1][j] << 1);
                f[i][j] |= (f[i][j - 1] << 1);
            }
            else {
                f[i][j] |= (f[i - 1][j] >> 1);
                f[i][j] |= (f[i][j - 1] >> 1);
            }
        }
    }
    if (f[n][m][1000])cout << "YES" << endl;
    else cout << "NO" << endl;

}

signed main() {
    cin.tie(0)->sync_with_stdio(0);
    cout.tie(0);
    int t = 1;
    cin >> t;
    while (t--)
        solve();
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码在运行时import SimpleITK as sitkimport numpy as npimport os# 设置文件路径data_path = 'C:/Users/Administrator/Desktop/LiTS2017/'save_path = 'C:/Users/Administrator/Desktop/2D-LiTS2017/'if not os.path.exists(save_path): os.makedirs(save_path)# 定义函数将3D图像保存为2D的.png格式def save_image_as_png(image, save_folder, name_prefix): for i in range(image.shape[2]): slice = np.squeeze(image[:, :, i]) slice = slice.astype(np.float32) slice *= 255.0/slice.max() slice = slice.astype(np.uint8) save_name = os.path.join(save_folder, name_prefix + '_' + str(i) + '.png') sitk.WriteImage(sitk.GetImageFromArray(slice), save_name)# 读取Training Batch 1中的图像image_path = os.path.join(data_path, 'Training Batch 1/volume-0.nii')image = sitk.ReadImage(image_path)image_array = sitk.GetArrayFromImage(image)save_folder = os.path.join(save_path, 'image')if not os.path.exists(save_folder): os.makedirs(save_folder)save_image_as_png(image_array, save_folder, 'img')# 读取Training Batch 2中的标签label_path = os.path.join(data_path, 'Training Batch 2/segmentation-0.nii')label = sitk.ReadImage(label_path)label_array = sitk.GetArrayFromImage(label)# 将标签转换为灰度图并保存label_array[label_array == 1] = 128label_array[label_array == 2] = 255save_folder = os.path.join(save_path, 'mask')if not os.path.exists(save_folder): os.makedirs(save_folder)save_image_as_png(label_array, save_folder, 'mask')会出现RuntimeWarning: divide by zero encountered in true_divide slice *= 255.0/slice.max()这种情况,修复它,并给出完整代码
05-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值