数字矩形

数字矩形

rectangle.pascal/c/cpp

 

【题目描述】

给一个由数字组成的矩形,每次可以向左、向右、向下走,求一条从最上层的任意一个点走到最下层的任意一个点最小数字和的路径,输出其值。

【输入】

输入第一行包含两个数n, m,表示矩形的行数和列数。

接下来的n行每行有m个数,每个数表示矩形该位置上的值。

【输出】

输出最上层的任意一个点走到最下层的任意一个点的最小数字和的路径值。

【输出样例】

3 4

9 9 1 9

2 2 2 9

1 9 9 9

【输出样例】

8

 

【样例解释】

9 9 19

2 2 2 9

1 9 9 9

是最优方案

【数据规模】

对于20%的数据,n, m不超过10

对于40%的数据,n * m不超过500

对于所有数据,n不超过100,m不超过500,每个数字不超过1000000。







题目描述很简单

状态很容易想出来,用 f [ i ] [ j ] 表示到位置 ( i , j ) 的最优值,但是有三个方向我们怎么转移呢?

我一开始的想法是不能,但是还是试着写了些,代码大概如下(错误的)

    for(int i=1;i<=n;i++)  
        for(int j=1;j<=m;j++)  
        {  
            f[i][j]=min(f[i][j],f[i-1][j]+map[i][j]);  
            if(j!=1) f[i][j]=min(f[i][j],f[i][j-1]+map[i][j]);  
            if(j!=m) f[i][j]=min(f[i][j],f[i][j+1]+map[i][j]);  
        }  

但是这样就有一个很严重的问题了,动态规划必须无后效性,然而我们退 f [ i ] [ j ] 的时候居然用到了它后面还没有计算的 f [ i ] [ j + 1 ] !显然是不对的!

那应该如何处理呢?

我们可以分步递推,也就是先把所有从上一层下来的情况推倒完,再推到所有从左边走过来的情况,再推到所有从右边走过来的情况,这样每次推到都是相对独立的,最后求一个最小值即可

【注】考试WA了0.0,看到分析很简单,但没见这么处理的。这类题可推广否?

    /* 
    http://blog.csdn.net/jiangzh7 
    By Jiangzh 
    */  
    #include<cstdio>  
    #include<cstring>  
    #include<queue>  
    #include<utility>  
    using namespace std;  
    #define min(a,b) ((a)<(b)?(a):(b))  
    const int N=500+10;  
    const int inf=0x3f3f3f3f;  
      
    int n,m;  
    int map[N][N];  
    int f[N][N];  
      
    int main()  
    {  
        freopen("rectangle.in","r",stdin);  
        freopen("rectangle.out","w",stdout);  
        scanf("%d%d",&n,&m);  
        for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) scanf("%d",&map[i][j]);  
        memset(f,0x3f,sizeof(f));  
        for(int j=0;j<=m;j++) f[0][j]=0;  
        for(int i=1;i<=n;i++)  
        {  
            for(int j=1;j<=m;j++) f[i][j]=min(f[i][j],f[i-1][j]+map[i][j]);  
            for(int j=2;j<=m;j++) f[i][j]=min(f[i][j],f[i][j-1]+map[i][j]);  
            for(int j=m-1;j>0;j--) f[i][j]=min(f[i][j],f[i][j+1]+map[i][j]);  
        }  
        int ans=inf;  
        for(int j=1;j<=m;j++) ans=min(ans,f[n][j]);  
        printf("%d\n",ans);  
        return 0;  
    }  


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
您可以使用OpenCV库来进行数字识别和矩形框的绘制。下面是一个简单的示例代码: ```python import cv2 import numpy as np # 加载数字识别模型 model = cv2.ml.KNearest_create() model.train(np.load('train_data.npy'), cv2.ml.ROW_SAMPLE, np.load('train_labels.npy')) # 加载图像并进行预处理 image = cv2.imread('image.jpg', cv2.IMREAD_GRAYSCALE) image = cv2.GaussianBlur(image, (5, 5), 0) _, image = cv2.threshold(image, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU) # 查找轮廓 contours, _ = cv2.findContours(image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE) # 遍历每个轮廓 for contour in contours: # 计算轮廓的边界框 x, y, w, h = cv2.boundingRect(contour) # 确保边界框的宽度和高度合适 if w > 10 and h > 10: # 提取数字区域并调整大小 digit = image[y:y+h, x:x+w] digit = cv2.resize(digit, (28, 28)) digit = np.float32(digit.reshape(-1, 784)) # 使用模型进行预测 _, result, _, _ = model.findNearest(digit, k=1) # 在图像上绘制矩形框和识别结果 cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2) cv2.putText(image, str(int(result[0][0])), (x, y), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2) # 显示结果图像 cv2.imshow('Result', image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 在这个示例中,我们首先加载了一个使用K最近邻算法训练的数字识别模型。然后,我们加载待处理的图像并进行预处理,包括灰度化、高斯模糊和二值化。接下来,我们使用`findContours`函数找到图像中的轮廓。对于每个轮廓,我们计算边界框并检查其宽度和高度是否合适。然后,我们提取数字区域并调整大小,使用训练好的模型进行预测。最后,我们在原始图像上绘制矩形框和识别结果,并显示结果图像。 请注意,此示例仅提供了一个基本的数字识别和矩形框绘制的框架,您可能需要根据您的具体需求进行适当的调整和优化。此外,在运行代码之前,请确保已经准备好数字识别模型和训练数据。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值