poj2978——Colored stones

本文通过一个具体的编程实例展示了动态规划(DP)算法的应用过程。从初始化到迭代更新,详细介绍了如何利用DP解决复杂问题,并给出了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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; }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值