#4512. black and white

题意

n × n n\times n n×n 的棋盘,每格或黑或白.

无法互达: 找不到一条包含起点终点、仅由黑色格子构成,且最多转向一次的路径。

S p e c i a l   p a i r Special\ pair Special pair: 两个无法互达的黑色格子.

一个 S p e c i a l   p a i r Special\ pair Special pair 的得分为两个格子的曼哈顿距离.

求最大得分,及有多少 S p e c i a l   p a i r Special\ pair Special pair 达到这个得分.
子任务一 ( 30 p t s ) (30pts) (30pts): n ≤ 200 n\le 200 n200.

子任务二 ( 30 p t s ) (30pts) (30pts): n ≤ 500 n\le 500 n500.

子任务三 ( 40 p t s ) (40pts) (40pts): n ≤ 2000 n\le 2000 n2000.

对所有数据, T ≤ 10 T\le 10 T10, 保证答案小于 2147483647 2147483647 2147483647.

题解

发现一个比较诡异的问题:两个格子越远,似乎越有机会成为 S p e c i a l   p a i r Special\ pair Special pair 。于是猜想最远的 S p e c i a l   p a i r Special\ pair Special pair中,一定有边缘(是所在的行/列的最边缘的黑格)的点。通过画图可以证明,如果一对 S p e c i a l   p a i r Special\ pair Special pair的两个点都不是边缘点,那么可以找到更远的 S p e c i a l   p a i r Special\ pair Special pair。于是若两个点都是边缘点,由于边缘点数是 O ( n ) O(n) O(n)的,直接枚举所有边缘点判断即可;否则,考虑对于一个边缘点和一个非边缘点,在非边缘点到边缘点的矩形的边缘点所在的矩形一定有白点,所以枚举非边缘点,判它所在的行、列的第一个白点与该点的矩形的左上角的左上的横、纵坐标之和最小的点,一个DP即可做完。因为要考虑不同方向,故将整个矩形翻转四次即可。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
import pandas as pd import numpy as np import matplotlib.pyplot as plt from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import confusion_matrix, accuracy_score, precision_score, recall_score, f1_score, roc_curve, roc_auc_score # 1. 数据读取与处理 data = pd.read_csv('data.csv') X = data.drop('target', axis=1) y = data['target'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) # 2. 模型训练 model = LogisticRegression() model.fit(X_train, y_train) # 3. 模型预测 y_pred = model.predict(X_test) y_prob = model.predict_proba(X_test)[:, 1] # 4. 绘制二分类混淆矩阵 confusion_mat = confusion_matrix(y_test, y_pred) plt.imshow(confusion_mat, cmap=plt.cm.Blues) plt.title('Confusion Matrix') plt.colorbar() tick_marks = np.arange(2) plt.xticks(tick_marks, ['0', '1']) plt.yticks(tick_marks, ['0', '1']) plt.xlabel('Predicted Label') plt.ylabel('True Label') for i in range(2): for j in range(2): plt.text(j, i, confusion_mat[i, j], ha='center', va='center', color='white' if confusion_mat[i, j] > confusion_mat.max() / 2 else 'black') plt.show() # 5. 计算精确率、召回率和F1-score precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred) f1 = f1_score(y_test, y_pred) # 6. 计算AUC指标和绘制ROC曲线 auc = roc_auc_score(y_test, y_prob) fpr, tpr, thresholds = roc_curve(y_test, y_prob) plt.plot(fpr, tpr, label='ROC curve (area = %0.2f)' % auc) plt.plot([0, 1], [0, 1], 'k--') plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.05]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate') plt.title('ROC Curve') plt.legend(loc="lower right") plt.show() # 7. 输出结果 print('Precision:', precision) print('Recall:', recall) print('F1-score:', f1) print('AUC:', auc)对每行代码进行注释
最新发布
06-09
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值