有向直线2中值问题(two)[60分]

程序两通过定义常量、变量、过程,并实现初始化和动态规划算法来解决特定问题。
 
program two;

const
 maxn=1000;
 maxm=2;

var
 n:longint;
 w:array [0..maxn] of longint;
 d:array [0..maxn,0..maxn] of longint;
 f:array [-1..maxn,-1..maxn,-1..maxm] of longint;

procedure init;
var
 i,j:longint;
begin
 fillchar(d,sizeof(d),100);
 fillchar(f,sizeof(f),100);
 readln(n);
 for i:=n downto 1 do readln(w[i],d[i,i-1]);
 for i:=0 to n-1 do for j:=i+2 to n do d[j,i]:=d[j-1,i]+d[j,j-1];
end;

function min(x,y:longint):longint;
begin
 if x<y then exit(x) else exit(y);
end;

function dp(st,ed,build:longint):longint;
var
 i,temp:longint;
begin
 if f[st,ed,build]<f[-1,-1,-1] then exit(f[st,ed,build]);
 for i:=0 to build do
  begin
   temp:=0;
   if st<n then inc(temp,dp(st+1,ed,build));
   inc(temp,d[st,ed]*w[st]);
   f[st,ed,build]:=min(f[st,ed,build],temp);
  end;
 for i:=0 to build-1 do
  begin
   temp:=0;
   if st<n then inc(temp,dp(st+1,st,build-1));
   f[st,ed,build]:=min(f[st,ed,build],temp);
  end;
 exit(f[st,ed,build]);
end;

begin

 init;
 writeln(dp(0,0,2));
 readln;
 
end.

%% 晶圆预对准完整工作流 clc; clear; close all; %% 第一部:生成模拟晶圆图像(若无可替换为真实图像) % 创建500x500空白图像 img_size = 500; sim_img = ones(img_size) * 200; % 灰色背景 % 绘制模拟晶圆(圆心偏移版) [xx,yy] = meshgrid(1:img_size); real_center = [250+15, 250-20]; % 真实圆心偏移量 real_radius = 200; % 真实半径 mask = (xx - real_center(1)).^2 + (yy - real_center(2)).^2 <= real_radius^2; sim_img(mask) = 50; % 晶圆区域设为深灰色 % 添加噪声模拟实际情况 noise_intensity = 20; sim_img = imnoise(sim_img, 'gaussian', 0, noise_intensity/255); %% 第二部:图像预处理 gray_img = im2gray(sim_img); % 转换为灰度图像 filtered_img = medfilt2(gray_img, [5 5]); % 中值滤波去噪 %% 第三部:边缘检测 edge_img = edge(filtered_img, 'canny', [0.1 0.3]); % Canny边缘检测 %% 第四部:边缘点采样 [y, x] = find(edge_img); points = [x, y]; % 转换为(x,y)坐标格式 % 随机采样控制计算量(保留1000点) if size(points,1) > 1000 points = datasample(points, 1000, 'Replace', false); end % 执行拟合 [fit_center, fit_radius] = circleFitLSQ(points); %% 第六部:结果可视化 figure('Position', [100 100 1200 500]) % 原始图像与边缘点 subplot(1,2,1); imshow(sim_img); hold on; plot(points(:,1), points(:,2), 'r.', 'MarkerSize', 8); title('边缘检测结果'); axis equal; % 拟合结果展示 subplot(1,2,2); imshow(sim_img); hold on; plot(points(:,1), points(:,2), 'r.', 'MarkerSize', 8); % 绘制拟合圆 theta = linspace(0, 2*pi, 100); fit_x = fit_center(1) + fit_radius*cos(theta); fit_y = fit_center(2) + fit_radius*sin(theta); plot(fit_x, fit_y, 'b-', 'LineWidth', 2); % 标注圆心 plot(fit_center(1), fit_center(2), 'g+', 'MarkerSize', 15, 'LineWidth', 2); title(sprintf('预对准结果\n圆心(%.1f,%.1f) 半径%.1f',... fit_center(1), fit_center(2), fit_radius)); axis equal; %% 第七部:误差析 distances = abs(sqrt((points(:,1)-fit_center(1)).^2 + ... (points(:,2)-fit_center(2)).^2) - fit_radius); rmse = sqrt(mean(distances.^2)); fprintf('===== 性能评估 =====\n'); fprintf('真实圆心: (%.1f, %.1f)\n', real_center(1), real_center(2)); fprintf('拟合圆心: (%.1f, %.1f)\n', fit_center(1), fit_center(2)); fprintf('圆心偏移: %.2f像素\n', norm(real_center - fit_center)); fprintf('半径误差: %.2f像素\n', abs(real_radius - fit_radius)); fprintf('拟合均方根误差(RMSE): %.4f像素\n', rmse); %% 第五部:最小二乘圆拟合核心算法 function [center, radius] = circleFitLSQ(points) x = points(:,1); y = points(:,2); % 构建线性方程组 Ax = b A = [x, y, ones(size(x))]; b = -(x.^2 + y.^2); params = A \ b; % 最小二乘解 % 转换为几何参数 center = [-params(1)/2, -params(2)/2]; radius = sqrt(params(1)^2/4 + params(2)^2/4 - params(3)); end这段代码哪里有问题帮我修改一下
最新发布
05-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值