动 态 规 划

news2024/11/16 7:40:05

一、(what?)

二、(why?)

三、(how?)

四、典型例题分析:

例题1:神奇的兔子序列

输入:月数

输出:兔子数

思路:

代码1(函数递归):

#include<iostream>
using namespace std;

int fib(int n)
{
	if(n < 1)
		return -1;
	else if(n == 1|| n == 2)
		return 1;
	else
		return fib(n-1)+fib(n-2);
}

int main()
{
	int n;
	cin>>n;
	cout<<fib(n);
	return 0;
} 

代码2(数组递归):

#include<iostream>
using namespace std;

int fib(int n)
{
	if(n < 1) return -1;
	int F[n+1];
	F[1] = 1, F[2] = 1;
	for(int i = 3; i <= n; i++)
		F[i] = F[i-1]+F[i-2];
	return F[n];
}

int main()
{
	int n;
	cin>>n;
	cout<<fib(n);
	return 0;
} 

例题2:孩子有多像爸爸——最长公共子序列

 暴力搜索

举个简单的暴力搜索的

#include<iostream>
using namespace std;
int main()
{
	char s[7]={'A','B','C','B','A','D','B'};
	
	for(int k=0;k<=7;k++)
	{
		for(int i=k;i<=7;i++)
		{
			for(int j=k;j<i;j++)
			{
				cout<<s[j];
			}
			cout<<endl;
		}	
	}
	
	return 0;
 } 

 显示所有子串:

 求其中一个子串的数组:

#include<iostream>
using namespace std;
int main()
{
	char s[7] = {'A','B','C','B','A','D','B'};
	//char ss[6] = {'B','C','B','A','A','C'};
	
	string str1[100],str2[100];
	int len1=0,len2=0;
	
	for(int k=0;k<=7;k++)
	{
		for(int i=k;i<=7;i++)
		{
			for(int q=k;q<i;q++)
			{
				str1[len1]+=s[q];
			}
			len1++;
		}	
	}	
	for(int k=0;k<len1;k++)
	{
		cout<<str1[k]<<endl;
	}	
	return 0;
 } 

 输出:

题解代码:

#include<iostream>
#include<string>
using namespace std;

const int MAX=1000;

char s[MAX],ss[MAX];

string str1[MAX],str2[MAX];

int len1=0,len2=0;

int main()
{
	//char s[7] = {'A','B','C','B','A','D','B'};
	//char ss[6] = {'B','C','B','A','A','C'};
	
	//string str1[100],str2[100];
	//int len1=0,len2=0;
	
	string st1,st2;
	cin>>st1>>st2;
	int i=0,j=0;
	while(i<st1.length())
	{
		s[i]=st1[i];
		i++;
	}
	while(j<st2.length())
	{
		ss[j]=st2[j];
		j++;
	}
	
	//存入第一个子串数组 
	for(int k=0;k<=7;k++)
	{
		for(int i=k;i<=7;i++)
		{
			for(int q=k;q<i;q++)
			{
				str1[len1]+=s[q];
			}
			len1++;
		}	
	}
	/*	
	for(int k=0;k<len1;k++)
	{
		cout<<str1[k]<<endl;
	}	*/
	//存入第二个子串数组
	for(int k=0;k<=6;k++)
	{
		for(int i=k;i<=6;i++)
		{
			for(int q=k;q<i;q++)
			{
				str2[len2]+=ss[q];
			}
			len2++;
		}	
	}	
	/*	
	for(int k=0;k<len2;k++)
	{
		cout<<str2[k]<<endl;
	}	 
	*/
	int temp=0,max=-1000;
	string answer;
	for(int i=0;i<len1;i++)
	{
		string strr1=str1[i];
		for(int j=0;j<len2;j++)
		{
			if(str2[j]==strr1)
			{
				temp=strr1.length();
				if(temp>=max)
				{
					max=temp;
					answer=strr1;
				}
			}
		}	
	} 
	cout<<answer<<endl<<max;	
	return 0;
 } 

结果:

*注:这并不是例题的解法,只是对暴力搜索举个例子,二者并无关联!

原理题的条件子串是从父亲的基因中取一些值并非一定连续!!!

 下面,用动态规划算法解决此问题

算法设计:

图解算法:

 

 

 

 

 

伪代码:

Void LCSL()
{
    int I,j;
    for(I = 1;I <= len1;i++)    //控制s1序列
      for(j = 1;j <= len2;j++)  //控制s2序列
      {
        if(s1[i-1]==s2[j-1])    //字符下标从0开始
        {   //如果当前字符相同,则公共子序列的长度为该字符前的最长公共序列+1
            c[i][j] = c[i-1][j-1]+1;
            b[i][j] = 1;
        }
        else
        {
            if(c[i][j-1]>=c[i-1][j]) //两者找最大值,并记录最优策略来源
            {
                  c[i][j] = c[i][j-1];
                  b[i][j] = 2;
            }
            else
            {
                  c[i][j] = c[i-1][j];
                  b[i][j] = 3;
            }
        }
     }
}

Void print(int I, int j)//根据记录下来的信息构造最长公共子序列(从b[i][j]开始递推)
{
    if(i==0 || j==0) return;
    if(b[i][j]==1)
    {
        print(i-1,j-1);
        cout<<s1[i-1];
    }
    else if(b[i][j]==2)
              print(I,j-1);
          else print(i-1,j);
}

代码:

#include<iostream>
#include<string>
using namespace std;
const int N = 1002;//数组最大长度 
int c[N][N], b[N][N];//c:公共子序列长度。b:答案路径
char s1[N], s2[N];
int len1, len2;


//动态规划查询最大子序列函数 
void LCSL()
{
	int i, j;
	for (i = 1; i <= len1; i++)//控制s1序列
	{
		for (j = 1; j <= len2; j++)//控制s2序列
		{
			//动态规划开始
			if (s1[i - 1] == s2[j - 1])//字符下标从0开始 
			{//如果字符相同,公共子序列的长度为该字符前的最长公共子序列(左上角)+1 
				c[i][j] = c[i - 1][j - 1] + 1;
				b[i][j] = 1;//此情况标记为1 
			}
			else
			{//如果字符不相等的子序列长度 
				if (c[i][j - 1] >= c[i - 1][j])
				{//如果上面的大于左面,子序列长度为上值 
					c[i][j] = c[i][j - 1];
					b[i][j] = 2;//取上值为2 
				}
				else
				{//如果左大于上,取左值 
					c[i][j] = c[i - 1][j];
					b[i][j] = 3;//取左值为3 
				}
			}
		}
	}
	for (i = 0; i <= len1; i++)
	{
		for(j = 0; j <= len2; j++)
		{
			cout << c[i][j];
		}
		cout << endl;
	}
}

//输出最优路径的函数(因为是函数递归,所以经过倒退能得到正序路径) 
void print(int i, int j)//从b[i][j]开始递推 
{
	if (i == 0 || j == 0) return;//如果有一个序列递归完了就结束递归
	if (b[i][j] == 1)
	{//说明此时s1[i-1]=s2[j-1],b[i][j]的值来自c左上角 
		print(i - 1, j - 1);//递归去左上角 
		cout << s1[i - 1];
	}
	else if (b[i][j] == 2)
	{//s1[i-1]与s2[j-1]不等,b[i][j]值来自c上 
		print(i, j - 1);
	}
	else
	{//字符不等取值来自左 
		print(i - 1, j);
	}
}

int main()
{
	int i, j;
	cout << "输入字符串s1:" << endl;
	cin >> s1;
	cout << "输入字符串s2:" << endl;
	cin >> s2;
	len1 = strlen(s1);//求char型数组的长度
	len2 = strlen(s2);

	for (i = 0; i <= len1; i++)
	{
		c[i][0] = 0;//初始化第一行	
	}
	for (j = 0; j <= len2; j++)
	{
		c[0][j] = 0;//初始化第一列	
	}

	LCSL();//求最长子序列
	cout << "最长子序列长度为:" << c[len1][len2] << endl;
	cout << "最长公共子序列是:";
	print(len1, len2);
	return 0;
}

输出: 

例题3:DNA基因鉴定——编辑距离

 算法设计:

算法图解:

 

 

伪代码:

int editdistance(char *str1, char *str2)
{
     int len1 = strlen(str1);      //计算字符串长度
     int len2 = strlen(str2); 
     for(int i=0;i<=len1;i++)      //当第二个串长度为0,编辑距离初始化为i
          d[i][0]= i;
     for(int j=0;j<=len2;j++)      //当第一个串长度为0,编辑距离初始化为j
          d[0][j]=j;
     for(int i=1;i <=len1;i++)     //遍历两个字符串
     {
          for(int j=1;j<=len2;j++)
          {
               int diff;//判断str[i]是否等于str2[j],相等为0,不相等为1
               if(str1[i-1] == str2[j-1]) //相等
                     diff = 0 ;
               else
                     diff = 1 ;
               int temp = min(d[i-1][j] + 1, d[i][j-1] + 1);//先两者取最小值
               d[i][j] = min(temp, d[i-1][j-1] + diff);//再取最小值,
                     //相当于三者取最小值d[i-1][j] + 1, d[i][j-1] + 1,d[i-1][j-1] + diff
          }
     }
     return d[len1][len2];
}

 完整代码:

#include<iostream>
#include<string>
using namespace std;
const int N = 100;
char str1[N],str2[N];
int d[N][N];//d[i][j]表示的str1前i个字符的str2前j个字符的编辑距离

int StrLen(char *s)//求字符串长度 
{
	int i=0;
	while(s[i]!='\0')
	{
		i++;	
	}	
	return i;
} 

int min(int a,int b)
{
	return a<b?a:b; //返回较小值 
}
 
int editdistance(char *str1,char *str2)
{
	int len1=StrLen(str1);
	int len2=StrLen(str2);	
	//初始化
	for(int i=0;i<=len1;i++)
	{//第二个串长度为0,编辑距离初始化为i 
		d[i][0]	= i;
	} 
	for(int j=0;j<=len2;j++)
	{//第二个串长度为0,编辑距离初始化为j
		d[0][j]	= j;
	}
	//遍历两个字符串 
	for(int i=1;i<=len1;i++)
	{
		for(int j=1; j<=len2;j++)
		{
			int diff;//判断字符是否相等,相等不需要编辑+0,不相等+1
			if(str1[i-1] == str2[j-1])
			{
				diff=0;
			}
			else
			{
				diff=1;	
			} 
			int temp=min(d[i-1][j]+1,d[i][j-1]+1);
			d[i][j] = min(temp,d[i-1][j-1]+diff);//连去两次两个求最小值等价于三个求最小值 
		}
	}
	for(int i=0;i<=len1;i++)
	{
		for(int j=0;j<=len2;j++)
		{
			cout<<d[i][j];
		}
		cout<<endl;
	}
	return d[len1][len2]; 
} 
int main()
{
	cin>>str1>>str2;
	cout<<editdistance(str1,str2);
	return 0;
}

 输入输出:

例题4:长江一日游——游艇租赁

算法设计: 

 算法图解:

伪代码:

void rent()
{
     int i,j,k,d;
     for(d=3;d<=n;d++) //将问题分为小规模d
     {
          for(i=1;i<=n-d+1;i++)
               {
                    j=i+d-1;
                    for(k=i+1;k<j;k++)  //记录每一个小规模内的最优解
                    {
                         int temp;
                         temp=m[i][k]+m[k][j];
                         if(temp<m[i][j])
                               {
                                 m[i][j]=temp;
                                 s[i][j]=k;
                               }
                    }
               }
     }
}

 

void print(int i,int j)
{
     if(s[i][j]==0 )
     {
          cout << "--"<<j;
          return ;
     }
     print(i,s[i][j]);
     print(s[i][j],j);
}

 完整代码:

//program 4-3
#include<iostream>
using namespace std;
const int ms = 1000;
int r[ms][ms],m[ms][ms],s[ms][ms];    //i到j站的租金
int n;            //共有n个站点
void rent()
{
     int i,j,k,d;
     for(d=3;d<=n;d++) //将问题分为小规模为d
     {
         for(i=1;i<=n-d+1;i++)
              {
                   j=i+d-1;
                   for(k=i+1;k<j;k++)  //记录每一个小规模内的最优解
                   {
                        int temp;
                        temp=m[i][k]+m[k][j];
                        if(temp<m[i][j])
                             {
                                m[i][j]=temp;
                                s[i][j]=k;
                             }
                   }
              }
     }
}
void print(int i,int j)
{
     if(s[i][j]==0 )
     {
         cout << "--"<<j;
         return ;
     }
     print(i,s[i][j]);
     print(s[i][j],j);
}
int main()
{
     int i,j;
     cout << "请输入站点的个数 n:";
     cin >> n;
     cout << "请依次输入各站点之间的租金:";
     for(i=1;i<=n;i++)
          for(j=i+1;j<=n;++j)
          {
              cin>>r[i][j];
              m[i][j]=r[i][j];
          }
     rent();
     cout << "花费的最少租金为:" <<m[1][n] << endl;
     cout <<"最少租金经过的站点:"<<1;
     print(1,n);
     return 0;
}

输入输出:

例题5:快速计算——矩阵连乘

 算法设计:

图解算法:

 伪代码:

void print(int i,int j)
{
     if( i == j )
     {
         cout <<"A[" << i << "]";
         return ;
     }
     cout << "(";
     print(i,s[i][j]);
     print(s[i][j]+1,j);
     cout << ")";
}

 完整代码:

//program 4-4
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
const int msize = 100;
int p[msize];
int m[msize][msize],s[msize][msize];
int n;
void matrixchain()
{
     int i,j,r,k;
     memset(m,0,sizeof(m));
     memset(s,0,sizeof(s));
     for(r = 2; r <= n; r++)          //不同规模的子问题
     {
          for(i = 1; i <= n-r+1; i++)
          {
              j = i + r - 1;
              m[i][j] = m[i+1][j] + p[i-1] * p[i] * p[j];  //决策为k=i的乘法次数
              s[i][j] = i;            //子问题的最优策略是i;
              for(k = i+1; k < j; k++) //对从i到j的所有决策,求最优值,记录最优策略
               {
                    int t = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];
                    if(t < m[i][j])
                    {
                          m[i][j] = t;
                          s[i][j] = k;
                    }
               }
          }
     }
}
void print(int i,int j)
{
     if( i == j )
     {
          cout <<"A[" << i << "]";
          return ;
     }
     cout << "(";
     print(i,s[i][j]);
     print(s[i][j]+1,j);
     cout << ")";
}
int main()
{
     cout << "请输入矩阵的个数 n:";
     cin >> n;
     int i ,j;
     cout << "请依次输入每个矩阵的行数和最后一个矩阵的列数:";
     for (i = 0; i <= n; i++ )
          cin >> p[i];
     matrixchain();
     print(1,n);
     cout << endl;
     cout << "最小计算量的值为:" << m[1][n] << endl;
}

 输入输出:

例题6:切呀切披萨——最优三角剖分

例题7:小石子游戏——石子合并

例题8:大卖场购物车——0-1背包问题

 算法设计:

 图解算法:

伪代码:

for(i=1;i<= n;i++)           //计算c[i][j]
          for(j=1;j<=W;j++)
               if(j<w[i])    //当物品的重量大于购物车的容量,则不放此物品
                    c[i][j] = c[i-1][j];
               else          //否则比较此物品放与不放是否能使得购物车内的价值最大
                    c[i][j] = max(c[i-1][j],c[i-1][j-w[i]] + v[i]);
     cout<<"装入购物车的最大价值为:"<<c[n][W]<<endl;

 

//逆向构造最优解
j=W;
for(i=n;i>0;i--)
    if(c[i][j]>c[i-1][j])
    {
         x[i]=1;
         j-=w[i];
    }
    else
        x[i]=0;
cout<<"装入购物车的物品为:";
for(i=1;i<=n;i++)
    if(x[i]==1)
         cout<<i<<"  ";

 完整代码:

//program 4-7
#include <iostream>
#include<cstring>
using namespace std;
#define maxn 10005
#define M 105
int c[M][maxn];         //c[i][j] 表示前i个物品放入容量为j购物车获得的最大价值
int w[M],v[M];          //w[i] 表示第i个物品的重量,v[i] 表示第i个物品的价值
int x[M];               //x[i]表示第i个物品是否放入购物车
int main(){
     int i,j,n,W;       //n表示n个物品,W表示购物车的容量
     cout << "请输入物品的个数n:";
     cin >> n;
     cout << "请输入购物车的容量W:";
     cin >> W;
     cout << "请依次输入每个物品的重量w和价值v,用空格分开:";
     for(i=1;i<=n;i++)
          cin>>w[i]>>v[i];
     for(i=0;i<=n;i++)  //初始化第0列为0
          c[i][0]=0;
     for(j=0;j<=W;j++)  //初始化第0行为0
          c[0][j]=0;
     for(i=1;i<= n;i++) //计算c[i][j]
          for(j=1;j<=W;j++)
               if(j<w[i])  //当物品的重量大于购物车的容量,则不放此物品
                    c[i][j] = c[i-1][j];
               else    //否则比较此物品放与不放是否能使得购物车内的价值最大
                    c[i][j] = max(c[i-1][j],c[i-1][j-w[i]] + v[i]);
     cout<<"装入购物车的最大价值为:"<<c[n][W]<<endl;
     //逆向构造最优解
     j=W;
     for(i=n;i>0;i--)
          if(c[i][j]>c[i-1][j])
          {
               x[i]=1;
               j-=w[i];
          }
          else
               x[i]=0;
     cout<<"装入购物车的物品为:";
     for(i=1;i<=n;i++)
          if(x[i]==1)
               cout<<i<<"  ";
     return 0;
}

输入输出:

例题9:快速定位——最优二叉搜索

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1222993.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

计算机视觉的应用18-一键抠图人像与更换背景的项目应用,可扩展批量抠图与背景替换

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用18-一键抠图人像与更换背景的项目应用&#xff0c;可扩展批量抠图与背景替换。该项目能够让你轻松地处理和编辑图片。这个项目的核心功能是一键抠图和更换背景。这个项目能够自动识别图片中的主体&…

Apache Airflow (九) :Airflow Operators及案例之BashOperator及调度Shell命令及脚本

&#x1f3e1; 个人主页&#xff1a;IT贫道_大数据OLAP体系技术栈,Apache Doris,Clickhouse 技术-CSDN博客 &#x1f6a9; 私聊博主&#xff1a;加入大数据技术讨论群聊&#xff0c;获取更多大数据资料。 &#x1f514; 博主个人B栈地址&#xff1a;豹哥教你大数据的个人空间-豹…

手机LiDAR-based激光雷达标定板提高无人汽车智能化程度

手机LiDAR-based 3D扫描和建模测试系统是一种利用激光雷达&#xff08;LiDAR&#xff09;技术进行三维扫描和模型创建的工具&#xff0c;它可以在手机上运行。这种测试系统可以用于各种应用&#xff0c;如地形测绘、建筑物建模、机器人视觉、无人驾驶汽车导航等。 手机LiDAR-ba…

【Linux网络编程】高级I/O

目录 五种I/O模型 阻塞和非阻塞 非阻塞I/O I/O多路复用之Select、Poll、与Epoll 本文目的是深入浅出理解高级I/O相关的知识&#xff0c;结尾附上代码加深理解相关知识。 五种I/O模型 1.阻塞I/O&#xff1a;在内核将数据准备好之前&#xff0c;系统调用会一直等待。所有的套…

CTFHub | Cookie注入,UA注入,Refer注入,过滤空格(利用hackbar插件)

Cookie注入 Cookie 注入原理 Cookie 注入的原理也和其他注入一样&#xff0c;只不过是将提交的参数以 Cookie 方式提交&#xff0c;而一般的注入是使用 GET 或者 POST 方式提交&#xff0c;GET 方式提交就是直接在网址后面加上需要注入的语句&#xff0c;POST 方式则是通过表单…

【计算机基础】优雅的PPT就应该这样设计

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

【Java SE】继承

学习完了类之后&#xff0c;我们将继续学习一个Java中的重点内容“继承” 继承 1.1 为什么需要继承 举例&#xff1a; 在Cat类中和Dog类中我们发现有很多一样的地方&#xff0c;这样写太浪费空间和内存了 我们可以把它相同的地方都用一个类来表示&#xff0c;并且使用它1.2 继…

PCL 半径滤波剔除噪点(二)

目录 一、算法原理二、注意事项三、代码实现一、算法原理 PCL半径滤波是删除在输入的点云一定范围内没有达到足够多领域的所有数据点。通俗的讲:就是以一个点p给定一个范围r,领域点要求的个数为m,r若在这个点的r范围内部的个数大于m则保留,小于m则删除。因此,使用该算法时…

【MATLAB源码-第82期】基于matlab的OFDM系统载波频移偏差(CFO)估计,对比三种不同的方法。

操作环境&#xff1a; MATLAB 2013b 1、算法描述 正交频分复用&#xff08;OFDM&#xff09;系统中的载波频率偏移&#xff08;CFO&#xff09;估计是一项关键技术&#xff0c;用于确保数据传输的准确性和效率。CFO通常由于振荡器频率不匹配和多普勒频移引起。不同的CFO估计…

Docker Volume: 实现容器间数据共享与持久化的利器

文章目录 Docker Volume的作用Docker Volume与容器内数据的比较优势劣势 Docker Volume的创建和管理创建Docker Volume管理Docker Volume 演示Docker Volume的挂载Docker Volume的生命周期安全性考虑与Docker Volume应用场景Docker Volume与多容器协作容器迁移与Docker Volume未…

电子学会2023年6月青少年软件编程(图形化)等级考试试卷(二级)真题,含答案解析

青少年软件编程(图形化)等级考试试卷(二级) 一、单选题(共25题,共50分) 1. 运行下列哪段程序,可以让狗狗走到木屋门口?( ) A.

vite vue3安装element-plus

准备 参考 安装 官网 yarn add element-plus完整引入 如果你对打包后的文件大小不是很在乎&#xff0c;那么使用完整导入会更方便。 main.ts // main.ts import { createApp } from vue import ElementPlus from element-plus import element-plus/dist/index.css import…

数据资产到底如何入表?

2024年1月1日起&#xff0c;财政部《企业数据资源相关会计处理暂行规定》正式施行&#xff0c;距离现在只有一个多月的时间。 数据资源入表意味着企业可以将数据资源确认为企业资产负债表中“资产”一项。对于拥有丰富数据资源的企业来说&#xff0c;有望在财务报表中体现其真…

C++软件开发面试场景题

自己在秋招过程中遇到的一些场景题 海量数据N取Top K个元素&#xff0c;复杂度是多少 在处理海量数据中获取前K个元素&#xff08;Top K&#xff09;的问题中&#xff0c;通常会使用一些高效的算法来减少时间和空间复杂度。以下是两种常见的解决方案和它们的复杂度&#xff1…

VS中修改解决方案名称和项目名称

如何修改visual studio2019中的项目名 - 知乎 (zhihu.com) 查了很多&#xff0c;还是这个可行。虽然文中说不是最简单的&#xff0c;但在所查找资料中是可行且最简单的。 要点主要是&#xff1a; 1、比如我们复制一个解决方案&#xff0c;最好是带代码哈&#xff0c;也就是添…

Python 爬虫入门

文章目录 Python 爬虫入门requests 库beautifulsoup4库函数findall()&#xff0c;find()函数get() 爬虫实例 1&#xff1a;抓小说爬虫实例 2&#xff1a;抓豆瓣 top 250 的电影信息后记 Python 爬虫入门 Python 的爬虫功能使得程序员可以快速抓取并分析网页中的信息&#xff0…

【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Nacos 一、nacos实现配置管理1.1 统一配置管…

C#WPF用户控件及自定义控件实例

本文演示C#WPF自定义控件实例 用户控件(UserControl)和自定义控件(CustomControl)都是对UI控件的一种封装方式,目的都是实现封装后控件的重用。 只不过各自封装的实现方式和使用的场景上存在差异。 1 基于UserControl 创建 创建控件最简单一个方法就是基于UserControl …

基于Vue+SpringBoot的高校学生管理系统 开源项目

项目编号&#xff1a; S 029 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S029&#xff0c;文末获取源码。} 项目编号&#xff1a;S029&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 学生管理模块2.2 学院课程模块2.3 学…

java智慧校园信息管理系统源码带微信小程序

一、智慧校园的定义 智慧校园指的是以云计算和物联网为基础的智慧化的校园工作、学习和生活一体化环境。以各种应用服务系统为载体&#xff0c;将教学、科研、管理和校园生活进行充分融合&#xff0c;让校园实现无处不在的网络学习、融合创新的网络科研、透明高效的校务治理、…