临时简易题解
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];
}