ZOJ 3471 状态DP


有 N 种 atom,每种 atom 与不同于自身的 atom 碰撞会产生一定能量,且有一方消失,

atom 自身不能和自身碰撞,有一个矩阵表示他们之间碰撞所产生的能量,

A[i][j] = x 代表 i 和 j 碰撞,产生 x能量且 j 消失,问最多能产生多少能量?


#include <iostream>
#include <cstring>
using namespace std;

int arr[11][11];
int dp[1 << 10];

int main(){

    int atom_num = 0;

    while( cin >> atom_num ){

        if( atom_num == 0 )
            break;

        for( int row = 0; row < atom_num; ++row )
            for( int col = 0; col < atom_num; ++col )
                cin >> arr[row][col];

        memset( dp, 0, sizeof( dp ) );

        const int bits = 1 << atom_num;
        int ans = 0;

        for( int bit = 0; bit < bits; ++bit ){
            for( int alive = 0; alive < atom_num; ++alive ){
                if( bit & ( 1 << alive ) )
                    continue;
                for( int death = 0; death < atom_num; ++death ){
                    if( bit & ( 1 << death ) || alive == death )
                        continue;
                    dp[bit + ( 1 << death )] = max( dp[bit + ( 1 << death )], dp[bit] + arr[alive][death] );
                    ans = max( ans, dp[bit + ( 1 << death )] );
                }
            }
        }

        cout << ans << endl;

    }

    return 0;

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值