漳州网站开发去博大钱少a,厦门正规的网站建设公司,高端电商设计公司,大连哪家网站公司好http://acm.timus.ru/problem.aspx?space1num1830 这道题需要理解题目操作的意思, 要更改第i位的状态,第i-1位必须激活为1,0-i-2位必须为0,如果0-i-1位开始时全为0,那么从0位开始进行操作 一.首先考虑对于0-i-1位都是0,需要更改i位的情况,需要 1.更改i-1位,2.按一下打开下…http://acm.timus.ru/problem.aspx?space1num1830 这道题需要理解题目操作的意思, 要更改第i位的状态,第i-1位必须激活为1,0-i-2位必须为0,如果0-i-1位开始时全为0,那么从0位开始进行操作 一.首先考虑对于0-i-1位都是0,需要更改i位的情况,需要 1.更改i-1位,2.按一下打开下一页 对于更改i-1位,需要1.更改i-2位,2.按一下打开下一页,3.更改i-2位 可以得到一个式子,设f[i]为第0-i-1位均为0时,使得状态成为第i位被更改,第0-i-1位仍为0的操作数,则f[i]2*f[i-1]1 二.因为从前往后更改会影响之前的状态,所以我们从后往前更改,当最后一个不相同位置e已被上面的操作更改后,只有e-1位为1,其它都为0,满足上面的条件,可以直接相加 三.对于更改最后一位e的操作,因为这个时候前面不一定全都为0,所以有: 假设第e位是第i个1, 对于第i-1个1,这个1是有用的,可以作为起点,如果它是第j位,它的操作数为f[j]1,对于e来说,因为计算f[e]时认为2*f[j]1,所以要减去f[j], 对于第i-2个1,这个1阻碍了第i-1个1,是无用的,如果它是第j位,它的操作数为3*f[j]1(一次关闭操作),对于e来说,需要加上f[j] 对于第i-3个1,有用, 对于第i-4个1,无用........ 依次类推,直接相加可得答案 四:注意long long #include cstdio
#include cstring
using namespace std;
typedef long long ll;
char org[100],aim[100];
ll f[50];
int main(){int n;ll ans0;scanf(%d%s%s,n,org,aim);f[0]1;for(int i1;in;i){f[i]2*f[i-1]1;}for(int in-1;i0;i--){if(org[i]aim[i])continue;ll sub0;int fl1;for(int ji-1;j0;j--){if(org[j]1){subsubf[j]*fl;if(j!i-1)org[j]0;fl-fl;}}if(i0)org[i-1]1;ans(i0?f[i-1]:0)-sub1;org[i]aim[i];}printf(%I64d\n,ans);return 0;
}转载于:https://www.cnblogs.com/xuesu/p/4296895.html