2016夏季练习——dp

来源:POJ1185

对于影响因素的个数来判断需要的维度,根据状态的多少来开辟数组

对于各个状态进行一个比较,注意使用压缩的方法对于问题中的所有东西进行优化

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m;
const int N=100+5;
const int M=10;
const int MAXN= (1<<10)+5;

int dp[N][N][N];
//dp[floor][prestate][currstate]
int mp[N];
char ch;
int st[100];
int sum[100];
/*
dp关键是要找出那些量杜宇当前状态的决策会产生影响,而这个影响的种类往往确定维度
dp[r][i][j]=max{dp[r-1][j][k]}+sum[i]
*/
bool judge(int x){
	if(x&(x<<1)) return false;
	if(x&(x<<2)) return false;
	return true;
}
int asksum(int x){
	int cnt=0;
	while(x>0){
		if(x&1) cnt++;
		x>>=1;
	}
	return cnt;
}
int main(){
	while(scanf("%d%d",&n,&m)!=EOF){
		getchar();
		memset(mp,0,sizeof(mp));
		for(int i=0;i<n;i++){
			for(int j=0;j<m;j++){
				scanf("%c",&ch);
				if(ch=='H'){
					mp[i]|=(1<<j);
					//cout<<i<<" "<<j<<endl;
				}
				//cout<<ch;
			}
			getchar();
			//cout<<endl;
		}
		memset(dp,-1,sizeof(dp));
		int k=0;
		for(int j=0;j<(1<<m);j++){
			if(judge(j)){
				st[k]=j;
				sum[k++]=asksum(j);
				//cout<<sum[k-1]<<endl;
			}
		}
		//cout<<"k: "<<k<<endl;
		for(int i=0;i<k;i++)
			if(!(mp[0]&st[i])) {//youdu
				dp[0][0][i]=sum[i];
				//cout<<sum[i]<<endl;
			}

		for(int floor=1; floor<n; floor++){
			for(int stn1=0; stn1<k; stn1++){
				if(st[stn1] & mp[floor]) continue;
				//cout<<"dd"<<endl;
				for(int stn2=0; stn2<k; stn2++){
					if(st[stn1] & st[stn2]) continue;
					//cout<<"kk"<<endl;
					for(int stn3=0; stn3<k; stn3++){
						if(st[stn1] & st[stn3]) continue;
						//cout<<"cc"<<endl;
						if(dp[floor-1][stn3][stn2]==-1) continue;
						dp[floor][stn2][stn1]=max(dp[floor][stn2][stn1],dp[floor-1][stn3][stn2]+sum[stn1]);
						/*if(floor==n-1) {
							cout<<dp[n-1][stn2][stn1]<<endl;
						}*/
					}
				}
			}
		}
		//cout<<"-----------"<<endl;
		int ans=0;
		for(int i=0;i<k;i++){
			for(int j=0;j<k;j++){
				ans=max(ans,dp[n-1][i][j]);
				//cout<<dp[n-1][i][j]<<endl;
			}
		}
		cout/*<<"ans: "*/<<ans<<endl;
	}
	return 0;
}


【直流微电网】径向直流微电网的状态空间建模与线性化:一种耦合DC-DC变换器状态空间平均模型的方法 (Matlab代码实现)内容概要:本文介绍了径向直流微电网的状态空间建模与线性化方法,重点提出了一种基于耦合DC-DC变换器状态空间平均模型的建模策略。该方法通过对系统中多个相互耦合的DC-DC变换器进行统一建模,构建出整个微电网的集中状态空间模型,并在此基础上实施线性化处理,便于后续的小信号分析与稳定性研究。文中详细阐述了建模过程中的关键步骤,包括电路拓扑分析、状态变量选取、平均化处理以及雅可比矩阵的推导,最终通过Matlab代码实现模型仿真验证,展示了该方法在动态响应分析和控制器设计中的有效性。; 适合人群:具备电力电子、自动控制理论基础,熟悉Matlab/Simulink仿真工具,从事微电网、新能源系统建模与控制研究的研究生、科研人员及工程技术人员。; 使用场景及目标:①掌握直流微电网中多变换器系统的统一建模方法;②理解状态空间平均法在非线性电力电子系统中的应用;③实现系统线性化并用于稳定性分析与控制器设计;④通过Matlab代码复现和扩展模型,服务于科研仿真与教学实践。; 阅读建议:建议读者结合Matlab代码逐步理解建模流程,重点关注状态变量的选择与平均化处理的数学推导,同时可尝试修改系统参数或拓扑结构以加深对模型通用性和适应性的理解。
### 关于蓝桥杯 Python 中跳跃类题目及其解法 #### 题目背景与分析 蓝桥杯竞赛中的跳跃类题目通常涉及数组操作、动态规划 (Dynamic Programming, DP) 或贪心算法。这类问题的核心在于如何合理设计状态以及优化计算过程[^2]。 对于跳跃类问题,常见的场景包括: - **单向跳跃**:给定一系列位置和每一步可跳的最大步数,判断能否到达终点。 - **多方向跳跃**:允许向前或向后跳跃一定距离,求最小跳跃次数或其他目标函数值。 以下是针对此类问题的一个通用解决方案框架: --- #### 动态规划解决跳跃问题的思路 动态规划是一种常用的策略来处理跳跃类问题。其核心思想是定义一个 `dp` 数组,其中每个元素表示达到该位置所需的最少跳跃次数或某种最优条件下的代价。 假设我们有一个长度为 `n` 的数组 `arr` 表示各个位置的状态,则可以按照如下方式构建动态规划方程: ```python def min_jumps(arr): n = len(arr) dp = [float('inf')] * n # 初始化 dp 数组为无穷大 dp[0] = 0 # 初始位置不需要跳跃 for i in range(1, n): # 遍历每一个位置 for j in range(i): # 尝试从前一个位置跳到当前位置 if j + arr[j] >= i and dp[j] != float('inf'): # 如果可以从 j 跳到 i dp[i] = min(dp[i], dp[j] + 1) # 更新当前最少跳跃次数 return dp[-1] if dp[-1] != float('inf') else -1 # 返回最后一个位置的结果 ``` 上述代码实现了基于动态规划的最小跳跃次数问题解答方法。 --- #### 使用贪心算法优化跳跃问题 除了动态规划外,某些特定条件下还可以采用更高效的贪心算法解决问题。例如,在“跳跃游戏”中只需要验证是否存在一种路径能够抵达终点即可,而无需关心具体的跳跃次数。 下面是一个典型的贪心算法实现例子: ```python def can_jump_greedy(arr): max_reach = 0 # 当前能到达的最远索引 for i, jump in enumerate(arr): if i > max_reach: # 若当前位置无法被覆盖则返回 False return False max_reach = max(max_reach, i + jump) # 更新最大可达范围 return True # 如果循环结束说明可以到达最后一位 ``` 此段代码利用了局部最优原则——即每次尽可能扩展所能触及的距离,从而保证整体效率最高。 --- #### 总结 无论是通过动态规划还是贪心算法解决跳跃类问题,都需要仔细考虑边界情况并选择合适的数据结构存储中间结果。此外,实际编程过程中还应注意时间复杂度控制以应对大规模数据集带来的挑战。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值