sicily 1108 Online Selection DP

//dp
//题意:
//n组数字,对第i组数字回答 1或0 答案与ai一样就加一分, 回答1跳到第 I1 组 回答0同理
//要求给定回答的次数 k、得分m,输出过程中最多选择多少次0
//初始从第0组开始回答

//dp[p][l][so] 下一组数组是p,当前已选择l次,得分so的最优解
#include <iostream>
#include <cstdio>
#include <cstring>

using namespace std;

int c, n, k, m;
int i0[20], i1[20],a[20];
int dp[25][35][35]; 
int main()
{
	while( scanf( "%d",&c ) && c != 0 )
	{
		scanf( "%d%d%d",&n,&k,&m );
		for( int i = 0;i < n;i++ )
			scanf( "%d%d%d",i0+i,i1+i,a+i );
		
		memset( dp,-1,sizeof(dp) );
		
		//初始化弄错WA了很多次呢
		dp[0][0][0] = 0;
		dp[ i0[0] ][1][1] = (( a[0] == 0 ) ? 1 : dp[ i0[0] ][1][1]);
		dp[ i0[0] ][1][0] = (( a[0] == 0 ) ? dp[ i0[0] ][1][0]: 1);
		dp[ i1[0] ][1][1] = (( a[0] == 1 ) ? 0 : dp[ i1[0] ][1][1]);
		dp[ i1[0] ][1][0] = (( a[0] == 1 ) ? dp[ i1[0] ][1][0]: 0);

		for( int l = 1;l < k;l++ )
		{
			for( int p = 0;p < n;p++ )
			{
				for( int so = 0;so <= m;so++ )
				{
					if( dp[p][l][so] != -1 )
					{
						if( a[p] == 0 )
						{
							dp[ i0[p] ][l+1][so+1] = max( dp[ i0[p] ][l+1][ so+1 ] , dp[p][l][so]+1 );
							dp[ i1[p] ][l+1][so]   = max( dp[ i1[p]][l+1][ so ], dp[p][l][so] );
						}
						else
						{
							dp[ i0[p] ][l+1][so]   = max( dp[ i0[p] ][l+1][ so ] ,dp[p][l][so] + 1 );
							dp[ i1[p] ][l+1][so+1] =  max( dp[ i1[p]][l+1][ so+1], dp[p][l][so] );
						}
					}
				}
			}
		}

		int result = dp[ 0 ][k][m];
		
		for( int i = 1;i < n;i++ )
		{
			if( result < dp[i][k][m] ) result = dp[i][k][m];
		}
		if( result < 0 ) result = 0;
		printf( "%d %d\n",c,result );

	}
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值