UVa116 Unidirectional TSP

本文介绍了一种使用动态规划解决最小路径和问题的方法,包括状态转移方程的建立和特殊情况的处理。

        一道很容易看出状态转移的DP。一共有n*m个状态,即对应格子走到最后的最小和。需要记录路径,还需要注意n或m为1的特殊情况。


#include <iostream>    
#include <stdio.h>    
#include <cmath>    
#include <algorithm>    
#include <iomanip>    
#include <cstdlib>    
#include <string>    
#include <memory.h>    
#include <vector>    
#include <queue>    
#include <stack>    
#include <map>  
#include <set>  
#include <ctype.h>    
#define INF 1000000  
#define ll long long
#define min3(a,b,c) min(a,min(b,c))
  
using namespace std;  

int mm[12][110];
int dp[12][110];
int path[12][110];
int main(){
	int m,n;
	while(cin>>m>>n){
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				scanf("%d",&mm[i][j]);
			}
		}
		for(int i=1;i<=m;i++){
			dp[i][n]=mm[i][n];
		}
		for(int i=n-1;i>0;i--){
			for(int j=1;j<=m;j++){
				if(j==1){
					int tmp=min3(dp[m][i+1],dp[j][i+1],dp[j+1][i+1]);
					dp[j][i]=mm[j][i]+tmp;
					if(dp[j][i+1]==tmp){
						path[j][i]=j;
					}else if(dp[j+1][i+1]==tmp){
						path[j][i]=j+1;
					}else{
						path[j][i]=m;
					}
				}else if(j==m){
					int tmp=min3(dp[j-1][i+1],dp[j][i+1],dp[1][i+1]);
					dp[j][i]=mm[j][i]+tmp;
					if(dp[1][i+1]==tmp){
						path[j][i]=1;
					}else if(dp[j-1][i+1]==tmp){
						path[j][i]=j-1;
					}else{
						path[j][i]=j;
					}
				}else{
					int tmp=min3(dp[j-1][i+1],dp[j][i+1],dp[j+1][i+1]);
					dp[j][i]=mm[j][i]+tmp;
					if(dp[j-1][i+1]==tmp){
						path[j][i]=j-1;
					}else if(dp[j][i+1]==tmp){
						path[j][i]=j;
					}else{
						path[j][i]=j+1;
					}
				}
				
			}
		}
		int ans=INF;
		int k;
		for(int i=1;i<=m;i++){
			if(dp[i][1]<ans)ans=dp[i][1],k=i;
		}
		
		if(m!=1){
			for(int i=1;i<=n;i++){
				cout<<k;
				k=path[k][i];
				if(i!=n)cout<<" ";
			}
			cout<<endl<<ans<<endl;
		}else {
			if(n==1){
				cout<<1<<endl;
				cout<<mm[1][1]<<endl;
			}else{
				int sum=0;
				for(int i=1;i<=n;i++){
					cout<<1;
					if(i!=n)cout<<" ";
					sum+=mm[1][i];
				}
				cout<<endl<<sum<<endl;
			}
		}
	}
	return 0;
}


<think> 嗯,用户这次的问题是关于"transport unidirectional in IT field",结合了之前讨论的"transport"概念。看来用户正在研究网络通信相关的技术方向。 从用户之前的提问习惯看,ta似乎是个技术人员,可能正在搭建某个需要单向传输的系统。这次提问提到"unidirectional",说明关注点从通用传输转向了特定传输模式。用户引用的三段材料里,[1]提到分块传输的尾部字段,[2]是编程基础要求,[3]讲协议转换网关,这些虽然不直接相关,但说明用户可能在处理底层通信问题。 需要特别注意用户要求结合"transport"和"unidirectional"两个关键词。在IT领域,单向传输主要有几个典型场景: 首先是流媒体传输,比如HLS协议中服务器持续向客户端推送数据流;其次是监控系统,像安防摄像头只发送不接收的数据流;还有金融市场的行情推送服务,这些都需要可靠的单向传输机制。 用户可能实际想了解的是协议层实现单向传输的技术方案。考虑到ta之前关注过协议转换(引用[3]),或许正在集成不同协议的设备。单向传输常用UDP而不是TCP,因为不需要握手和确认。不过引用[1]提到的分块传输机制(Trailer头部)属于HTTP协议范畴,这和单向传输关系不大。 准备在回复时重点解释三类单向传输应用场景,并对比关键协议特征。要强调单向传输虽然简单但存在丢包风险的特殊性,这个技术点用户可能会忽略。最后生成的三个延伸问题要覆盖协议选择、应用实例和错误处理这些实用角度。 </think> 在IT领域,"transport unidirectional"(单向传输)指数据仅沿单一方向流动的通信模式,常见于以下场景: ### 一、核心概念与技术实现 1. **单向传输协议** 使用无连接协议(如UDP)实现单向数据流,无需接收方确认: $$ \text{发送端} \xrightarrow{\text{数据流}} \text{接收端} $$ 典型案例:传感器数据上报、监控视频流传输[^3] 2. **传输层特性** - **无反向信道**:接收端无法通过原路径反馈(如卫星广播) - **头部控制**:通过特定头部字段声明传输模式(如HTTP Trailer字段声明分块传输特性[^1]) 3. **协议转换架构** 工业场景中通过网关实现协议转换,保持单向传输特性: ```mermaid graph LR 设备[传感器] -->|Modbus| 网关 -->|MQTT| 云平台 ``` 网关仅转发数据,不建立双向会话[^3] ### 二、典型应用场景 | **场景** | **技术实现** | **优势** | |-------------------|----------------------------------|------------------------| | 媒体直播 | RTP over UDP | 低延迟,抗丢包 | | 日志收集 | Syslog协议 | 轻量级,高吞吐量 | | 工业遥测 | Modbus RTU→MQTT网关转换[^3] | 兼容遗留设备 | ### 三、关键技术挑战 1. **数据完整性保障** 通过前向纠错(FEC)或应用层重传机制补偿丢包,例如: $$ \text{FEC} = \bigoplus_{i=1}^{n} D_i \quad (D_i \in \text{数据块}) $$ 2. **传输效率优化** 采用分块传输编码(Chunked Transfer Encoding),通过Trailer字段传递校验信息[^1]: ``` HTTP/1.1 200 OK Transfer-Encoding: chunked Trailer: Content-MD5 ``` ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值