密码盘_纪中3067_dp

123 篇文章 0 订阅

Description


如图是某人设想中的N×N的密码盘,用以显示自己强大的智商以及计算能力。图中每列上面有一个0或1的值,每行左边也有一个0或1的值。密码盘中有最多N*N个按钮,每个按钮有一个数值。按钮按下去之后,你会获得按钮上的分数,然后对应行和对应列的值会改变。

例如:假设按钮(1,4)的数值为k,按下它,你获得k分,然后第一行的1会变成0,第四列的0会变成1。

你的任务是,使每列上面的值和每行左边的值一一对应相等(从左到右和从上到下),并且取得最大的积分。当然了初始积分为0。

Input


第一行一个正整数N,表示密码盘的大小。N最大为9。

第二行一个01串,表示从上到下每行左边的N个值。

第三行一个01串,表示从左到右每列上边的N个值。

下一行一个正整数k,表示按钮的数量。1≤k≤N*N。

接下来k行,每行三个整数a、b、c,表示第a行第b列处有一个数值为c的按钮。左上角的格子为第一行第一列。1≤a≤N,1≤b≤N,-100≤C≤100。不会有同一个地方出现两个按钮。

Output


输出一行,包含一个整数,表示所能取得的最大积分。如果不能使得每列上面的值和每行左边的值一一对应相等,输出“I am stupid!”。

题解


f[k][i][j]=max(f[k1][u][v]+w[k],f[k1][i][j])
然后第一维可以滚
看到n<=9就要想到状压了,I am stupid那个点也是恶意满满,无力吐槽

Code


#include <stdio.h>
using namespace std;
int x[82],y[82],w[82];
int f[2][513][513];
bool p[513];
char s[255];
int max(int x,int y)
{
    return x>y?x:y;
}
int main()
{
    int n,m,a=0,b=0;
    scanf("%d",&n);
    scanf("%s",&s);
    int limit=(1<<n)-1;
    for (int i=1;i<=n;i++)
        a+=((int)(s[i-1])-48)<<(i-1);
    scanf("%s",&s);
    for (int i=1;i<=n;i++)
        b+=((int)(s[i-1])-48)<<(i-1);

    for (int i=0;i<=limit;i++)
        for (int j=0;j<=limit;j++)
            f[0][i][j]=-2147483647/2;
    f[0][a][b]=0;
    int l=0;
    scanf("%d",&m);
    for (int i=1;i<=m;i++)
        scanf("%d%d%d",&x[i],&y[i],&w[i]);

    for (int k=1;k<=m;k++)
    {
        l=l^1;
        for (int i=0;i<=limit;i++)
            for (int j=0;j<=limit;j++)
                {
                    int u=i^(1<<(x[k]-1));
                    int v=j^(1<<(y[k]-1));
                    f[l][i][j]=max(f[l^1][i][j],f[l^1][u][v]+w[k]);
                }
    }
    int ans=-2147483647/3;
    for (int i=0;i<=limit;i++)
        if (f[l][i][i]>ans)
            ans=f[l][i][i];
    if (ans!=-2147483647/3)
        printf("%d\n",ans);
    else
        printf("I am stupid!\n");
    return 0;
}
开机密码密钥锁 ================== 软件功能: 1-硬开机时须要输入你安装时设置的密码(10位),密码不对开不了机,同时可选择使用USB做为开机密钥。 2-如果安装时插入USB,该将做为开机密钥,开机时显示:Shu Ru Mi Ma:+USB,不插该或插错,即使密码正确,开机后自动关机。 3-如果安装时不插任何USB,将不检查密钥,开机时显示:Shu Ru Mi Ma:只要密码正确就可以开机。 4-安装时修改硬MBR,故最好备份硬分区表到可以启动的USB,同时关闭杀毒软件以防禁止操作。 5-安装本软件的硬分区表加密存放,故用光或其它启动启动也看不见此硬,该硬的数据彻底得到保护,即使挂到其它电脑上也看不见。 6-做为开机密钥的USB没有特殊要求也不写入任何数据,当然如果想用它启动要自行制作USB启动!做好密钥后最好不要再对其格式化。 7-本软件有注册窗口和机器码,但安装后可以无限制使用,不注册明年起只在安装时有限制(7次)重新安装系统或恢复系统备份时此限制取消。 8-为了安全最好在不重要的机器上试验,否则后果自负。 本软件在自己的联想笔记本和技嘉台式机上,WINXP,WIN7,WIN8系统下测试2年正常,其它机器环境下未做普遍试验, 希望试用的朋友做好硬主引导区MBR备份及恢复工具,如果出现开不了机,用USB启动,恢复MBR就可以开机,重新安装后再卸载可以完全清除。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值