一切来自这个比赛的安利..
javascript用 ! [] + - * 表示0~1000的数字
编码长度不超过75个字符
样例:
+![]
+!![]
然后找到这个博客
发现了一种jother编码的神奇东西
[]
是一个匿名函数,+
把它变成0,!
把它变成false……
//chrome console测试
[]
> []
+[]
> 0
![]
> false
那么对于![]
再加一个!就应该是true了,然后在加+便是1
当然在+[]
前面加一个!也能变成1
//chrome console测试
!+[]
> true
+!+[]
> 1
+!![]
> 1
一生万物
//前文提及博客通过加法生成的0~9
"+[]", //0
"+!![]", //1
"!![]+!![]", //2
"!![]+!![]+!![]", //3
"!![]+!![]+!![]+!![]", //4
"!![]+!![]+!![]+!![]+!![]", //5
"!![]+!![]+!![]+!![]+!![]+!![]", //6
"!![]+!![]+!![]+!![]+!![]+!![]+!![]", //7
"!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]", //8
"!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]" //9
但是对于这道题还是有字数限制…
75个字符…用sublime对于上面的测试了一下9就有45个字符了
话说google到一个网站….它使用了括号生成jother编码
尝试了一下是可以吧()
换成[]
的
所以一个思路就是通过拼接来实现三位数
[+!![]+[]]+[!![]+!![]+[]]+[!![]+!![]+!![]+[]]
"123"
但是前文已经提到,9就有45个字符了,那999通过这样的转换只能是
[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]+[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]+[!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+!![]+[]]
长度刚好150,是原来的两倍恍恍惚惚
然后还可以用乘法符号和减法
所以999可以表示成1000-1
[+!![]+[]]+[+[]+[]]+[+[]+[]]+[+[]+[]]-[+!![]+[]]
这样就只有49个字符啦= =
明显还是C++可以实现的…
乘以10还不如加0…
- 乘法优化
2*2生成的4比4要长…(因为要加括号)
2*3生成的6比1+…+1生成的6短(一个字节)
[!![]+!![]]*[!![]+!![]+!![]]
2*4生成的8比1+…+1生成的8短
[!![]+!![]]*[!![]+!![]+!![]+!![]]
34
3*3生成的9比1+1+…+1生成的9要短
[!![]+!![]+!![]]*[!![]+!![]+!![]]
只有35个字符
- 减法优化
10-1,10-2,10-3显然更小
[+!![]]+[+[]]-[+!![]+!![]+!![]]
[+!![]]+[+[]]-[+!![]+!![]]
28
[+!![]]+[+[]]-+!![]
20
所以下面总结一下构造
//0,1,2,3,4,5没有什么技巧 +[] //0 +!![] //1 !![]+!![] //2 !![]+!![]+!![] //3 !![]+!![]+!![]+!![] //4 !![]+!![]+!![]+!![]+!![] //5 //6 = 2 * 3 [!![]+!![]]*[!![]+!![]+!![]] //6 //7 = 10 - 3 8 = 10 - 2,9 = 10 - 1 [+!![]]+[+[]]-[+!![]+!![]+!![]] //7 [+!![]]+[+[]]-[+!![]+!![]] //8 [+!![]]+[+[]]-+!![] //9 //10 = [1] + 0
加法不需要加
[]
cost=1减法需要在后面加括号
dp[a][b] = dp[a]+dp[b]+3
b 等于1时候+1
拼接/乘法的时候需要在外面加
[]
来实现- dp[a][b] = dp[a]+dp[b]+5
- a 或 b 等于1时候+3
- a == b == 1 时候+1
- 但是拼接之后是字符串,还需要补上+[]来换元成数字,故再+3
所以这还是一道字符串处理的动态规划= =
但是看上去这样还是不能满足75的要求,所以这里需要分解因数= =
比如777 = +[[[+!![]]+[+[]]-[+!![]+!![]+!![]]]+[[+!![]]+[+[]]-[+!![]+!![]+!![]]]+[[+!![]]+[+[]]-[+!![]+!![]+!![]]]]
=[[+!![]]+[+[]]-[+!![]+!![]+!![]]]*[[+!![]]+[+!![]]+[+!![]]]
第一个分解长度是105第二个是7*111 长度是59,满足要求
有空补上接下来的DP步骤,感觉是一个完全背包的多次优化…