题意:
有一个数组,包含乱序1-n的元素,并且有些数被从数组中拿出,现在问怎样将这些数放回才能使,相邻两数为奇偶的对数最小
思路:
定义dp[i][j][k]为到n这个位置放了j个偶数最后一位为奇数或偶数
那么转移方程为:
令t=dp[i-1][j][k]
i.奇数:dp[i][j][1]=max(dp[i][j][1],t+(k!=1))
ii.偶数:dp[i][j+1][0]=max(dp[i][j][0],t+(k!=0))
#include#include #include #define inf 0x3f3f3f3f using namespace std; const int maxn=110; int dp[maxn][maxn][3],a[maxn],n; int main() { int n,num=0; scanf("%d",&n); for(int i=1;i<=n;i++) scanf("%d",&a[i]); num=n/2; memset(dp,inf,sizeof(dp)); dp[0][0][0]=dp[0][0][1]=0; for(int i=1;i<=n;i++){ for(int j=0;j){ for(int k=0;k<2;k++){ int t=dp[i-1][j][k]; if(a[i]){ if(a[i]%2) dp[i][j][1]=min(dp[i][j][1],t+(k!=1)); else dp[i][j+1][0]=min(dp[i][j+1][0],t+(k!=0)); } else{ for(int l=0;l<2;l++) dp[i][j+1-l][l]=min(dp[i][j+1-l][l],t+(l!=k)); } } } } printf("%d\n", min(dp[n][num][0], dp[n][num][1])); }