东北大学暑期acm夏令营 算法进阶第三天(动态规划)

部分内容参考:点我


好多leetcode原题,动态规划主要是找状态转移方程


第一题

东北大学暑期acm夏令营 算法进阶第三天(动态规划)_第1张图片

#include 
using namespace std;
int main()
{
	int a[61];
	a[1]=1;
	a[2]=2;
	for(int i=3;i<61;i++)
	{
		a[i]=a[i-1]+a[i-2];
	}
	int n,ans;
	cin>>n;
	while(n--)
	{
		cin>>ans;
		cout<<a[ans]<<endl;
	}
}  

第二题

东北大学暑期acm夏令营 算法进阶第三天(动态规划)_第2张图片

#include 
using namespace std;
const int INF=0x3f3f3f3f;
int a[1005][1005],f[1005];
int main()
{
	int n,m,x,y,z;
	cin>>n>>m;
	memset(a,0x3f,sizeof(a));memset(f,0x3f,sizeof(f));
	while(m--)
	{
		cin>>x>>y>>z;
		a[x][y]=z;
	}
	f[1]=0;
	for(int i=2;i<=n;i++)
	{
		for(int j=1;j<i;j++)
		{
			if(a[j][i]<INF)
			{
				f[i]=min(f[i],f[j]+a[j][i]);
			}
		}
	}
	cout<<f[n];
}  

第三题

东北大学暑期acm夏令营 算法进阶第三天(动态规划)_第3张图片

#include 
using namespace std;
int a[1005],f[1005],n,ans=1;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	f[1]=1;
	for(int i=2;i<=n;i++)
	{
		f[i]=1;
		for(int j=1;j<i;j++)
		{
			if(a[j]<a[i])
            {
                f[i]=max(f[i],f[j]+1);
                ans=max(ans,f[i]);
            }
		}
	}
	cout<<ans;
}  

第四题

东北大学暑期acm夏令营 算法进阶第三天(动态规划)_第4张图片

#include 
using namespace std;
string a,b;
int f[105][105],n,m;
int main()
{
	cin>>a>>b;
	n=a.length();m=b.length();
	for(int i=0;i<n;i++)
	{
		for(int j=0;j<n;j++)
		{
			if(a[i]==b[j])
			{
				if(i>0&&j>0)
				{
					f[i][j]=max(f[i][j],f[i-1][j-1]+1);
				}
				else
				{
					f[i][j]=max(f[i][j],1);
				}
			}
			if(i>0)f[i][j]=max(f[i-1][j],f[i][j]);
			if(j>0)f[i][j]=max(f[i][j-1],f[i][j]);
		}
	}
	cout<<f[n-1][m-1];
}  

第五题

东北大学暑期acm夏令营 算法进阶第三天(动态规划)_第5张图片

#include 
using namespace std;
int a[1000005],f[1000005],cnt,ans,num;
int main()
{
	while(cin>>num)
	{
		a[cnt++]=num;
	}
	f[0]=a[0];f[1]=a[1];
	for(int i=2;i<cnt;i++)
	{
		f[i]=max(f[i-1],f[i-2]+a[i]);
		ans=max(ans,f[i]);
	}
	cout<<ans;
}  

你可能感兴趣的:(算法,动态规划,图论)