临时简易题解

P3847 [TJOI2007]调整队形


#include<bits/stdc++.h>
using namespace std;
int dp[3010][3010],n,color[3010];//dp[i][j]表示i到j对称的最小次数 
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>color[i];
	}
	for(int l=2;l<=n;l++)
	{
		for(int i=1;i+l-1<=n;i++)
		{
			int j=i+l-1;
			if(color[i]==color[j])
			{
				dp[i][j]=dp[i+1][j-1];
			}
			else
			{
				dp[i][j]=min(dp[i+1][j],min(dp[i][j-1],dp[i+1][j-1]))+1;
			}
		}
	}
	cout<<dp[1][n];
}

P1353 [USACO08JAN]跑步Running


#include<bits/stdc++.h>
using namespace std;
int n,m,num[10010],ans,dp[10010][510];//dp[i][j]表示第i分钟疲劳度为j跑的距离 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>num[i]; 
	}
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=min(i,m);j++)
		{
			dp[i][0]=max(dp[i][0],dp[i-j][j]);
		}
		dp[i][0]=max(dp[i][0],dp[i-1][0]);
		for(int j=1;j<=m;j++)
		{
			dp[i][j]=max(dp[i][j],dp[i-1][j-1]+num[i]);
		}
	} 
	cout<<dp[n][0];
}
posted @ 2019-01-28 12:03  G_A_TS  阅读(404)  评论(0编辑  收藏  举报