|
|
dp的解法总是那么给力,而我却仍不给力!!!为什么?
......
不多说,继续dp!
#include<iostream>#include<cstdio>using namespace std;const int pow[6]={1,2,4,8,16,32};int m,k,x[105];int dp[105][35][5];int main(){int s,i,c;while(cin>>m>>k&&m!=0&&k!=0){for(i=1;i<=m;i++){cin>>x[i];x[i]--;}for(s=0;s<pow[k];s++){for(c=0;c<k;c++)dp[0][s][c]=0;//初始化}for(i=1;i<=m;i++){int t=x[i];for(s=pow[k]-1;s>=0;s--){for(c=0;c<k;c++)dp[i][s][c]=dp[i-1][s][c];if((s&pow[t])!=0)//不属于s集合,此处的&用得很巧妙!!!dp[i][s][t]=dp[i-1][s][t]+1;else {int ss=s+pow[t];for(c=0;c<k;c++){if(dp[i][ss][t]<dp[i-1][s][c]+1)dp[i][ss][t]=dp[i-1][s][c]+1;}}}}int max=0;for(s=0;s<pow[k];s++){for(c=0;c<k;c++)if(max<dp[m][s][c])max=dp[m][s][c];}cout<<(m-max)<<endl;}return 0;} |
|