六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 35|回复: 0

poj2978——Colored stones

[复制链接]

升级  93.8%

309

主题

309

主题

309

主题

进士

Rank: 4

积分
969
 楼主| 发表于 2013-1-26 13:37:55 | 显示全部楼层 |阅读模式
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;}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表