题意:给你一串数字,求用最少的变换次数将数字序列分成两部分,前
半部分为负数,后半部分为整数;
思路:算是个简单的DP吧,开一个数组dp,dp[i]表示以第i个元素为分
界点所需变换的次数,还要开一个数组存第i个元素后面有多少个负数。
#include<algorithm>
#include<iostream>
using namespace std;
const int ARRSIZE=100100;
const int MAXINF=(2<<20);
int num[ARRSIZE],dp[ARRSIZE],hs[ARRSIZE];
int main()
{
int i,n;
memset(hs,0,sizeof(hs));
memset(dp,0,sizeof(dp));
cin>>n;
for(i=0;i<n;i++)
cin>>num[i];
for(i=n-1;i>=1;i--)
num[i]<=0?hs[i]=hs[i+1]+1:hs[i]=hs[i+1];
int res=MAXINF;
for(i=0;i<n-1;i++)
{
if(num[i]>=0)
dp[i]=dp[i-1]+1;
else
dp[i]=dp[i-1];
res=min(res,dp[i]+hs[i+1]);
}
cout<<res<<endl;
return 0;
}

本文介绍了一种利用动态规划方法解决特定序列分段问题的算法。通过定义状态转移方程,优化序列分割策略,实现最小变换次数的目标。
692

被折叠的 条评论
为什么被折叠?



