E. Pchelyonok and Segments(简单DP)

题解:先将整个数组翻转,然后令dp[i][j]状态表示为表示从前i个数里面选,且选了j段数,属性为最后一段数的sum的最大值。然后根据最后一段的数的最后一个是否是第i个数进行状态转移。
详见代码。
AC代码:

#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef long long ll; 
const int N=1e5+5,M=505;
int n;
int a[N];
int sum[N];
int dp[N][M]; 
void solve(){
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	reverse(a+1,a+1+n);
	
	for(int i=0;i<=n;i++)
	for(int j=0;j<=500;j++)
	dp[i][j]=0,dp[i][1]=a[i];
	
	for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
	
	int res=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=500&&j<=i;j++){
			dp[i][j]=max(dp[i][j],dp[i-1][j]);
			int s=sum[i]-sum[i-j];
			//cout<<s<<"&&&&"<<dp[i-1][j-1]<<endl;
			if(s<dp[i-j][j-1]){
				dp[i][j]=max(dp[i][j],s);
				res=max(res,j);
			}
		}
	}
	
	cout<<res<<endl;
} 
 
main(){
	int T;
	cin>>T;
	while(T--)solve();
}```

from skimage.segmentation import slic, mark_boundaries import torchvision.transforms as transforms import numpy as np from PIL import Image import matplotlib.pyplot as plt import torch.nn as nn import torch # 定义超像素池化层 class SuperpixelPooling(nn.Module): def init(self, n_segments): super(SuperpixelPooling, self).init() self.n_segments = n_segments def forward(self, x): # 获取超像素标记图 segments = slic(x, n_segments=self.n_segments, compactness=10) # 将超像素标记图转换为张量 segments_tensor = torch.from_numpy(segments).unsqueeze(0).float() # 在超像素维度上进行最大池化 pooled = nn.AdaptiveMaxPool2d((self.n_segments, 1))(x * segments_tensor) # 压缩超像素维度 pooled = pooled.squeeze(3) # 返回池化后的特征图 return pooled # 加载图像 image = Image.open('3.jpg') # 转换为 PyTorch 张量 transform = transforms.ToTensor() img_tensor = transform(image).unsqueeze(0) # 将 PyTorch 张量转换为 Numpy 数组 img_np = img_tensor.numpy().transpose(0, 2, 3, 1)[0] # 使用 SLIC 算法生成超像素标记图 segments = slic(img_np, n_segments=60, compactness=10) # 将超像素标记图转换为张量 segments_tensor = torch.from_numpy(segments).unsqueeze(0).float() # 将超像素索引映射可视化 plt.imshow(segments, cmap='gray') plt.show() # 将 Numpy 数组转换为 PIL 图像 segment_img = Image.fromarray((mark_boundaries(img_np, segments) * 255).astype(np.uint8)) # 保存超像素索引映射可视化 segment_img.save('segment_map.jpg') # 使用超像素池化层进行池化 pooling_layer = SuperpixelPooling(n_segments=60) pooled_tensor = pooling_layer(img_tensor) # 将超像素池化后的特征图可视化 plt.imshow(pooled_tensor.squeeze().numpy().transpose(1, 0), cmap='gray') plt.show() 上述代码出现问题: pooled = nn.AdaptiveMaxPool2d((self.n_segments, 1))(x * segments_tensor) RuntimeError: The size of tensor a (512) must match the size of tensor b (3) at non-singleton dimension 2,如何修改
最新发布
06-09
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值