CF #689(Div. 2) B - Find the Spruce

题目如下:
CF圣诞树
Input:

4
2 3
.*.
***
2 3
.*.
**.
4 5
.***.
*****
*****
*.*.*
5 7
..*.*..
.*****.
*******
.*****.
..*.*..

Output:

5
3
23
34

解释
思路:
看出来这是DP就好解决了
首先观察到当一个位置为 * 时必然圣诞树数量至少为一,想让此点向下形成圣诞树,其下方、左下方、右下方都必须也是 *,只要这三个位置有一个不是 * ,那么就不会继续向下生成圣诞树了。也就是说:

dp[i][j]=min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1]))+1;
//要+1是因为要加上自身这一个*行程的圣诞树

由此,我们倒着分析这张图,一层层去向上推进dp[i][j]的数值
以最后一个样例为例,可以写出dp图为:
dp
总数把这些加起来即可!

分析结束,开始实操:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstring>
char mp[600][600];
int dp[600][600];
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        cin>>n>>m;
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                cin>>mp[i][j];
                if(mp[i][j]=='*')
                {
                    dp[i][j]++;//先把*标记出来
                }
            }
        }
        for(int i=n-1;i>=1;i--)//从图的右下角开始
        {
            for(int j=m-1;j>=2;j--)//图的边线位置的*必然只能产生一种圣诞树(也就是他本身,因为他没办法向下生成圣诞树)
            {
                if(mp[i][j]=='.')
                    dp[i][j]=0;
                else
                    dp[i][j]=min(dp[i+1][j-1],min(dp[i+1][j],dp[i+1][j+1]))+1;
            }
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=m;j++)
            {
                ans+=dp[i][j];//加起来
                //cout<<dp[i][j]<<' ';
            }
            //cout<<endl;
        }
        cout<<ans<<endl;
        memset(dp,0,sizeof(dp));//不要忘记清零
    }
    return 0;
}

写了这么久代码,每天找水题找找自信。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮您解决这个问题。首先,让我们看一下数据集的基本信息: 数据集名称:covtype.csv 数据集来源:UCI Machine Learning Repository 数据集描述:该数据集包含根据各种地理和环境因素测量的30个特征,来预测科罗拉多州罗斯国家森林区域树木类型。数据集中共有7个树木类型,分别是:1 - Spruce/Fir、2 - Lodgepole Pine、3 - Ponderosa Pine、4 - Cottonwood/Willow、5 - Aspen、6 - Douglas-fir、7 - Krummholz。 数据集下载地址:https://archive.ics.uci.edu/ml/datasets/covertype 根据您的需求,我们需要使用Jupyter Notebook来对该数据集进行处理和分析。以下是代码实现: 首先,我们需要导入所需的Python库,代码如下: ```python import pandas as pd import numpy as np from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.tree import DecisionTreeClassifier from sklearn.metrics import accuracy_score ``` 接着,我们需要读取数据集,代码如下: ```python data = pd.read_csv('covtype.csv') ``` 为了方便处理数据,我们需要将数据集中的目标变量(即树木类型)与其他特征分开,代码如下: ```python X = data.iloc[:, :-1] y = data.iloc[:, -1] ``` 由于数据集中的特征数量比较多,并且各个特征之间的取值范围也有所不同,因此我们需要对数据进行标准化处理,代码如下: ```python scaler = StandardScaler() X = scaler.fit_transform(X) ``` 接着,我们需要将数据集分为训练集和测试集,代码如下: ```python X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=58000, random_state=42) ``` 最后,我们使用决策树模型对数据进行训练和预测,并计算模型的准确率,代码如下: ```python model = DecisionTreeClassifier(random_state=42) model.fit(X_train, y_train) y_pred = model.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print('准确率:', accuracy) ``` 这样,我们就完成了树木类型识别任务的实现。希望这些代码能够对您有所帮助!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值