E. Negatives and Positives (线性dp)

传送门

参考代码:

void solve() {
	int n;
	std::cin >> n;
	std::vector<int> v(n);
	for (int i = 0; i < n; i++) {
		std::cin >> v[i];
	}
	std::vector<std::vector<long long>> dp(2, std::vector<long long>(n));
	dp[0][0] = v[0];
	dp[1][0] = -v[0];
	//处理边界
	for (int i = 1; i < n; ++i) {
		dp[0][i] = std::max(dp[0][i - 1] + v[i], dp[1][i - 1] - v[i]);
		dp[1][i] = std::max(dp[0][i - 1] - v[i], dp[1][i - 1] + v[i]);
	}
	std::cout << dp[0][n - 1] << '\n';
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
好的,这是一个比较复杂的问题,我会尽力为您解答。首先,您需要安装Pytorch框架以及相关依赖项。接下来,您可以按照以下步骤进行操作: 1.导入必要的库和模块 ```python import torch import torch.nn as nn import torch.optim as optim import numpy as np from sklearn.metrics import accuracy_score ``` 2.定义数据读取器和预处理模块 ```python class RNADataLoader: def __init__(self, file_path): self.file_path = file_path def __iter__(self): with open(self.file_path, 'r') as f: lines = f.readlines() for i in range(0, len(lines), 2): yield lines[i + 1].strip() class RNAPreprocessor: def __init__(self, l=101): self.l = l self.dict = {'A': 0, 'C': 1, 'G': 2, 'T': 3} def __call__(self, x): x = x.upper() x = x.replace('U', 'T') x = x.replace('N', 'A') x = x.replace('R', 'A') x = x.replace('Y', 'T') x = x.replace('S', 'C') x = x.replace('W', 'A') x = x.replace('K', 'G') x = x.replace('M', 'A') x = x.replace('B', 'C') x = x.replace('D', 'A') x = x.replace('H', 'A') x = x.replace('V', 'A') x = [self.dict[c] for c in x] if len(x) < self.l: x = x + [0] * (self.l - len(x)) else: x = x[:self.l] return np.array(x) ``` 3.定义模型 ```python class ConvNet(nn.Module): def __init__(self): super(ConvNet, self).__init__() self.conv1 = nn.Conv1d(4, 16, kernel_size=5, padding=2) self.conv2 = nn.Conv1d(16, 32, kernel_size=5, padding=2) self.conv3 = nn.Conv1d(32, 64, kernel_size=5, padding=2) self.pool = nn.MaxPool1d(kernel_size=2, stride=2) self.fc1 = nn.Linear(64 * 13, 128) self.fc2 = nn.Linear(128, 1) def forward(self, x): x = x.transpose(1, 2) x = self.pool(torch.relu(self.conv1(x))) x = self.pool(torch.relu(self.conv2(x))) x = self.pool(torch.relu(self.conv3(x))) x = x.view(-1, 64 * 13) x = torch.relu(self.fc1(x)) x = torch.sigmoid(self.fc2(x)) return x ``` 4.定义训练和验证函数 ```python def train(model, train_loader, val_loader, criterion, optimizer, device, epochs): for epoch in range(epochs): model.train() train_loss = 0.0 train_acc = 0.0 for x, y in train_loader: x, y = x.to(device), y.to(device) optimizer.zero_grad() outputs = model(x.float()) loss = criterion(outputs, y.float()) loss.backward() optimizer.step() train_loss += loss.item() train_acc += accuracy_score(y.cpu().numpy(), (outputs.cpu().numpy() > 0.5).astype(int)) train_loss /= len(train_loader) train_acc /= len(train_loader) model.eval() val_loss = 0.0 val_acc = 0.0 for x, y in val_loader: x, y = x.to(device), y.to(device) outputs = model(x.float()) loss = criterion(outputs, y.float()) val_loss += loss.item() val_acc += accuracy_score(y.cpu().numpy(), (outputs.cpu().numpy() > 0.5).astype(int)) val_loss /= len(val_loader) val_acc /= len(val_loader) print('Epoch [{}/{}], Train Loss: {:.4f}, Train Acc: {:.4f}, Val Loss: {:.4f}, Val Acc: {:.4f}' .format(epoch + 1, epochs, train_loss, train_acc, val_loss, val_acc)) ``` 5.训练模型并输出最终分类正确率 ```python train_neg = RNADataLoader('model/ALKBH5_Baltz2012.train.negatives.fa') train_pos = RNADataLoader('model/ALKBH5_Baltz2012.train.positives.fa') val_neg = RNADataLoader('model/ALKBH5_Baltz2012.val.negatives.fa') val_pos = RNADataLoader('model/ALKBH5_Baltz2012.val.positives.fa') preprocessor = RNAPreprocessor() train_data = [(preprocessor(x), 0) for x in train_neg] + [(preprocessor(x), 1) for x in train_pos] val_data = [(preprocessor(x), 0) for x in val_neg] + [(preprocessor(x), 1) for x in val_pos] train_loader = torch.utils.data.DataLoader(train_data, batch_size=128, shuffle=True) val_loader = torch.utils.data.DataLoader(val_data, batch_size=128, shuffle=False) device = torch.device('cuda' if torch.cuda.is_available() else 'cpu') model = ConvNet().to(device) criterion = nn.BCELoss() optimizer = optim.Adam(model.parameters()) train(model, train_loader, val_loader, criterion, optimizer, device, epochs=10) model.eval() test_neg = RNADataLoader('model/ALKBH5_Baltz2012.val.negatives.fa') test_pos = RNADataLoader('model/ALKBH5_Baltz2012.val.positives.fa') test_data = [(preprocessor(x), 0) for x in test_neg] + [(preprocessor(x), 1) for x in test_pos] test_loader = torch.utils.data.DataLoader(test_data, batch_size=128, shuffle=False) test_acc = 0.0 for x, y in test_loader: x, y = x.to(device), y.to(device) outputs = model(x.float()) test_acc += accuracy_score(y.cpu().numpy(), (outputs.cpu().numpy() > 0.5).astype(int)) test_acc /= len(test_loader) print('Test Accuracy: {:.4f}'.format(test_acc)) ``` 以上代码中,我们使用了卷积神经网络(ConvNet)模型,并使用BCELoss作为损失函数,使用Adam作为优化器。在训练过程中,我们使用了10个epoch,训练结束后,我们使用验证集计算了模型的分类正确率。最后,我们使用测试集计算了模型的最终分类正确率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值