class085 数位dp-下【算法】

class085 数位dp-下【算法】

在这里插入图片描述

code1 P2657 [SCOI2009] windy 数

// windy数
// 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数
// windy想知道[a,b]范围上总共有多少个windy数
// 测试链接 : https://www.luogu.com.cn/problem/P2657
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过

package class085;// windy数
// 不含前导零且相邻两个数字之差至少为2的正整数被称为windy数
// windy想知道[a,b]范围上总共有多少个windy数
// 测试链接 : https://www.luogu.com.cn/problem/P2657
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class Code01_WindyNumber {public static int MAXLEN = 11;public static int[][][] dp = new int[MAXLEN][11][2];public static void build(int len) {for (int i = 0; i <= len; i++) {for (int j = 0; j <= 10; j++) {dp[i][j][0] = -1;dp[i][j][1] = -1;}}}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));while (in.nextToken() != StreamTokenizer.TT_EOF) {int a = (int) in.nval;in.nextToken();int b = (int) in.nval;out.println(compute(a, b));}out.flush();out.close();br.close();}public static int compute(int a, int b) {return cnt(b) - cnt(a - 1);}// 求0~num范围上,windy数的个数public static int cnt(int num) {if (num == 0) {return 1;}int len = 1;int offset = 1;int tmp = num / 10;while (tmp > 0) {len++;offset *= 10;tmp /= 10;}build(len);return f(num, offset, len, 10, 0);}// offset完全由len决定,为了方便提取num中某一位数字(上节课内容)// 从num的高位开始,还剩下len位没有决定// 前一位的数字是pre,如果pre == 10,表示从来没有选择过数字// 如果之前的位已经确定比num小,那么free == 1,表示接下的数字可以自由选择// 如果之前的位和num一样,那么free == 0,表示接下的数字不能大于num当前位的数字// 返回<=num的windy数有多少个public static int f(int num, int offset, int len, int pre, int free) {if (len == 0) {return 1;}if (dp[len][pre][free] != -1) {return dp[len][pre][free];}int cur = num / offset % 10;int ans = 0;if (free == 0) {if (pre == 10) {// 之前的位和num一样,此时不能随意选择数字// 也从来没有选择过数字// 就表示:来到的是num的最高位ans += f(num, offset / 10, len - 1, 10, 1); // 一个数字也不要for (int i = 1; i < cur; i++) {ans += f(num, offset / 10, len - 1, i, 1);}ans += f(num, offset / 10, len - 1, cur, 0);} else {// 之前的位和num一样,此时不能随意选择数字,// 之前选择过数字prefor (int i = 0; i <= 9; i++) {if (i <= pre - 2 || i >= pre + 2) {if (i < cur) {ans += f(num, offset / 10, len - 1, i, 1);} else if (i == cur) {ans += f(num, offset / 10, len - 1, cur, 0);}}}}} else {if (pre == 10) {// free == 1,可以自由选择数字,前面的状况 < num// 从来没有选择过数字ans += f(num, offset / 10, len - 1, 10, 1); // 还是可以不选择数字for (int i = 1; i <= 9; i++) {ans += f(num, offset / 10, len - 1, i, 1);}} else {// free == 1,可以自由选择数字,前面的状况 < num// 选择过数字prefor (int i = 0; i <= 9; i++) {if (i <= pre - 2 || i >= pre + 2) {ans += f(num, offset / 10, len - 1, i, 1);}}}}dp[len][pre][free] = ans;return ans;}}

code2 P3413 SAC#1 - 萌数

// 萌数
// 如果一个数字,存在长度至少为2的回文子串,那么这种数字被称为萌数
// 比如101、110、111、1234321、45568
// 求[l,r]范围上,有多少个萌数
// 由于答案可能很大,所以输出答案对1000000007求余
// 测试链接 : https://www.luogu.com.cn/problem/P3413
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过

package class085;// 萌数
// 如果一个数字,存在长度至少为2的回文子串,那么这种数字被称为萌数
// 比如101、110、111、1234321、45568
// 求[l,r]范围上,有多少个萌数
// 由于答案可能很大,所以输出答案对1000000007求余
// 测试链接 : https://www.luogu.com.cn/problem/P3413
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;public class Code02_MengNumber {public static int MOD = 1000000007;public static int MAXN = 1001;public static int[][][][] dp = new int[MAXN][11][11][2];public static void build(int n) {for (int a = 0; a < n; a++) {for (int b = 0; b <= 10; b++) {for (int c = 0; c <= 10; c++) {for (int d = 0; d <= 1; d++) {dp[a][b][c][d] = -1;}}}}}public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));String[] strs = br.readLine().split(" ");out.println(compute(strs[0].toCharArray(), strs[1].toCharArray()));out.flush();out.close();br.close();}public static int compute(char[] l, char[] r) {int ans = (cnt(r) - cnt(l) + MOD) % MOD;if (check(l)) {ans = (ans + 1) % MOD;}return ans;}// 返回0~num范围上萌数有多少个public static int cnt(char[] num) {if (num[0] == '0') {return 0;}int n = num.length;long all = 0;long base = 1;for (int i = n - 1; i >= 0; i--) {// 不理解的话看一下,讲解041-同余原理all = (all + base * (num[i] - '0')) % MOD;base = (base * 10) % MOD;}build(n);return (int) ((all - f(num, 0, 10, 10, 0) + MOD) % MOD);}// 从num的高位开始,当前来到第i位// 前一位数字是p、前前一位数字是pp,如果值是10,则表示那一位没有选择过数字// 如果之前的位已经确定比num小,那么free == 1,表示接下的数字可以自由选择// 如果之前的位和num一样,那么free == 0,表示接下的数字不能大于num当前位的数字// 返回<=num且不是萌数的数字有多少个public static int f(char[] num, int i, int pp, int p, int free) {if (i == num.length) {return 1;}if (dp[i][pp][p][free] != -1) {return dp[i][pp][p][free];}int ans = 0;if (free == 0) {if (p == 10) {// 当前来到的就是num的最高位ans = (ans + f(num, i + 1, 10, 10, 1)) % MOD; // 当前位不选数字for (int cur = 1; cur < num[i] - '0'; cur++) {ans = (ans + f(num, i + 1, p, cur, 1)) % MOD;}ans = (ans + f(num, i + 1, p, num[i] - '0', 0)) % MOD;} else {// free == 0,之前和num一样,此时不能自由选择数字// 前一位p,选择过数字,p -> 0 ~ 9for (int cur = 0; cur < num[i] - '0'; cur++) {if (pp != cur && p != cur) {ans = (ans + f(num, i + 1, p, cur, 1)) % MOD;}}if (pp != num[i] - '0' && p != num[i] - '0') {ans = (ans + f(num, i + 1, p, num[i] - '0', 0)) % MOD;}}} else {if (p == 10) {// free == 1,能自由选择数字// 从来没选过数字ans = (ans + f(num, i + 1, 10, 10, 1)) % MOD; // 依然不选数字for (int cur = 1; cur <= 9; cur++) {ans = (ans + f(num, i + 1, p, cur, 1)) % MOD;}} else {// free == 1,能自由选择数字// 之前选择过数字for (int cur = 0; cur <= 9; cur++) {if (pp != cur && p != cur) {ans = (ans + f(num, i + 1, p, cur, 1)) % MOD;}}}}dp[i][pp][p][free] = ans;return ans;}public static boolean check(char[] num) {for (int pp = -2, p = -1, i = 0; i < num.length; pp++, p++, i++) {if (pp >= 0 && num[pp] == num[i]) {return true;}if (p >= 0 && num[p] == num[i]) {return true;}}return false;}}

code3 600. 不含连续1的非负整数

// 不含连续1的非负整数
// 给定一个正整数n,请你统计在[0, n]范围的非负整数中
// 有多少个整数的二进制表示中不存在连续的1
// 测试链接 : https://leetcode.cn/problems/non-negative-integers-without-consecutive-ones/

package class085;// 不含连续1的非负整数
// 给定一个正整数n,请你统计在[0, n]范围的非负整数中
// 有多少个整数的二进制表示中不存在连续的1
// 测试链接 : https://leetcode.cn/problems/non-negative-integers-without-consecutive-ones/
public class Code03_IntegersWithoutConsecutiveOnes {public static int findIntegers1(int n) {int[] cnt = new int[31];cnt[0] = 1;cnt[1] = 2;for (int len = 2; len <= 30; len++) {cnt[len] = cnt[len - 1] + cnt[len - 2];}return f(cnt, n, 30);}// cnt[len] : 二进制如果有len位,所有二进制状态中不存在连续的1的状态有多少个,辅助数组// 从num二进制形式的高位开始,当前来到第i位,之前的位完全和num一样// 返回<=num且不存在连续的1的状态有多少个public static int f(int[] cnt, int num, int i) {if (i == -1) {return 1; // num自身合法}int ans = 0;if ((num & (1 << i)) != 0) {ans += cnt[i];if ((num & (1 << (i + 1))) != 0) {// 如果num二进制状态,前一位是1,当前位也是1// 如果前缀保持和num一样,后续一定不合法了// 所以提前返回return ans;}}// 之前的高位和num一样,且合法,继续去i-1位递归ans += f(cnt, num, i - 1);return ans;}// 只是把方法1从递归改成迭代而已// 完全是等义改写,没有新东西public static int findIntegers2(int n) {int[] cnt = new int[31];cnt[0] = 1;cnt[1] = 2;for (int len = 2; len <= 30; len++) {cnt[len] = cnt[len - 1] + cnt[len - 2];}int ans = 0;for (int i = 30; i >= -1; i--) {if (i == -1) {ans++;break;}if ((n & (1 << i)) != 0) {ans += cnt[i];if ((n & (1 << (i + 1))) != 0) {break;}}}return ans;}}

code4 1067. 范围内的数字计数

// 范围内的数字计数
// 给定两个正整数a和b,求在[a,b]范围上的所有整数中
// 1 <= a, b
// 某个数码d出现了多少次
// 测试链接 : https://leetcode.cn/problems/digit-count-in-range/

统计每个位上的计数

package class085;// 范围内的数字计数
// 给定两个正整数a和b,求在[a,b]范围上的所有整数中
// 1 <= a, b
// 某个数码d出现了多少次
// 测试链接 : https://leetcode.cn/problems/digit-count-in-range/
public class Code04_DigitCount1 {public static int digitsCount(int d, int a, int b) {return count(b, d) - count(a - 1, d);}// 统计1~num范围上所有的数中,数码d出现了多少次// 注意是1~num范围,不是0~num范围public static int count(int num, int d) {int ans = 0;// left : 当前位左边的情况数// right : 当前位右边的情况数// 当前位的数字是curfor (int right = 1, tmp = num, left, cur; tmp != 0; right *= 10, tmp /= 10) {// 情况1:// d != 0// 1 ~ 30583 , d = 5// cur < d的情况// 个位cur=3 : 0000~3057 5// 个位上没有额外加//// cur > d的情况// 十位cur=8 : 000~304 5 0~9// 十位上额外加 : 305 5 0~9//// cur == d的情况// 百位cur=5 : 00~29 5 00~99// 百位上额外加 : 30 5 00~83// ...// 情况2:// d == 0// 1 ~ 30583 d = 0// cur > d的情况// 个位cur=3 : 0001~3057 0// 个位上额外加 : 3058 0//// cur > d的情况// 十位cur=8 : 001~304 0 0~9// 十位上额外加 : 305 0 0~9//// cur > d的情况// 百位cur=5 : 01~29 0 00~99// 百位上额外加 : 30 0 00~99//// cur == d的情况// 千位cur=0 : 1~2 0 000~099// 千位上额外加 : 3 0 000~583left = tmp / 10;cur = tmp % 10;if (d == 0) {left--;}ans += left * right;if (cur > d) {ans += right;} else if (cur == d) {ans += num % right + 1;}}return ans;}}

code4 P2602 [ZJOI2010] 数字计数

// 范围内的数字计数
// 给定两个正整数a和b,求在[a,b]范围上的所有整数中
// 每个数码(digit)各出现了多少次
// 1 <= a, b
// 测试链接 : https://www.luogu.com.cn/problem/P2602
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过

package class085;// 范围内的数字计数
// 给定两个正整数a和b,求在[a,b]范围上的所有整数中
// 每个数码(digit)各出现了多少次
// 1 <= a, b
// 测试链接 : https://www.luogu.com.cn/problem/P2602
// 请同学们务必参考如下代码中关于输入、输出的处理
// 这是输入输出处理效率很高的写法
// 提交以下的code,提交时请把类名改成"Main",可以直接通过import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.StreamTokenizer;public class Code04_DigitCount2 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StreamTokenizer in = new StreamTokenizer(br);PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));while (in.nextToken() != StreamTokenizer.TT_EOF) {long a = (long) in.nval;in.nextToken();long b = (long) in.nval;for (int i = 0; i < 9; i++) {out.print(digitsCount(i, a, b) + " ");}out.println(digitsCount(9, a, b));}out.flush();out.close();br.close();}public static long digitsCount(int d, long a, long b) {return count(b, d) - count(a - 1, d);}public static long count(long num, int d) {long ans = 0;for (long right = 1, tmp = num, left, cur; tmp != 0; right *= 10, tmp /= 10) {left = tmp / 10;if (d == 0) {left--;}ans += left * right;cur = tmp % 10;if (cur > d) {ans += right;} else if (cur == d) {ans += num % right + 1;}}return ans;}}

code4 233. 数字 1 的个数

// 数字1的个数
// 给定一个整数n
// 计算所有小于等于n的非负整数中数字1出现的个数
// 测试链接 : https://leetcode.cn/problems/number-of-digit-one/

package class085;// 数字1的个数
// 给定一个整数n
// 计算所有小于等于n的非负整数中数字1出现的个数
// 测试链接 : https://leetcode.cn/problems/number-of-digit-one/
public class Code04_DigitCount3 {public static int countDigitOne(int n) {return count(n, 1);}public static int count(int num, int d) {int ans = 0;for (int right = 1, tmp = num, left, cur; tmp != 0; right *= 10, tmp /= 10) {left = tmp / 10;cur = tmp % 10;if (d == 0) {left--;}ans += left * right;if (cur > d) {ans += right;} else if (cur == d) {ans += num % right + 1;}}return ans;}}

2023-12-18 15:41:10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/234436.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

7款创意性前端源码特效资源分享(附在线预览效果)

分享7款非常不错炫酷的前端特效源码 其中包含css动画特效、js原生特效、svg特效等 下面我会给出特效样式图或演示效果图 但你也可以点击在线预览查看源码的最终展示效果及下载源码资源 CSS绘制iPhone 14带动态岛 纯CSS绘制iPhone 14带动态岛模型 运行初始化时还附带出场动画 …

微信小程序动态导航栏(uniapp + vant)

本文使用到vant的van-tabbar组件来实现 一、uniapp整合vant ui vant小程序版本:https://vant-contrib.gitee.io/vant-weapp/#/home 注:vant并没有uniapp的版本,所以此处是引入小程序版本的ui 1. 下载vant编译后代码 https://github.com/youzan/vant-weapp/tree/dev/dist 2…

CentOs7.x安装部署SeaTunnelWeb遇到的坑

CentOs7.x安装部署SeaTunnelWeb遇到的坑 文章目录 1. 环境2. SeaTunnel安装部署2.1下载安装包2.2 设置环境变量2.3 安装连接器插件2.4 拷贝jar包到lib下2.5 启动命令2.6 执行官方client提交任务demo 3. SeaTunnel-Web安装部署3.1 下载安装包3.2 初始化数据库脚本或修改配置appl…

element plus 表格el-table行多选单选

1 行多选-点击checkbox 添加一个 el-table-column&#xff0c;设 type 属性为 selection 即可 <template><div class"box"><el-table :data"tableData" selection-change"handleSelectionChange"><el-table-column type&…

【单调栈】LeetCode:1944队列中可以看到的人数

作者推荐 【贪心算法】【中位贪心】.执行操作使频率分数最大 题目 有 n 个人排成一个队列&#xff0c;从左到右 编号为 0 到 n - 1 。给你以一个整数数组 heights &#xff0c;每个整数 互不相同&#xff0c;heights[i] 表示第 i 个人的高度。 一个人能 看到 他右边另一个人…

计算机网络 运输层下 | TCP概述 可靠传输 流量控制 拥塞控制 连接管理

文章目录 3 运输层主要协议 TCP 概述3.1 TCP概述 特点3.2 TCP连接RSVP资源预留协议 4 TCP可靠传输4.1 可靠传输工作原理4.1.1 停止等待协议4.1.2 连续ARQ协议 4.2 TCP可靠通信的具体实现4.2.1 以字节为单位的滑动窗口4.2.2 超时重传时间的选择4.2.3 选择确认SACK 5 TCP的流量控…

边缘计算有哪些常用场景?TSINGSEE边缘AI视频分析技术行业解决方案

随着ChatGPT生成式人工智能的爆发&#xff0c;AI技术在业界又掀起一波新浪潮。值得关注的是&#xff0c;边缘AI智能也在AI人工智能技术进步的基础上得到了快速发展。IDC跟踪报告数据显示&#xff0c;2021年我国的边缘计算服务器整体市场规模达到33.1亿美元&#xff0c;预计2020…

2023年中国法拍房用户画像和数据分析

法拍房主要平台 法拍房主要平台有3家&#xff0c;分别是阿里、京东和北交互联平台。目前官方认定纳入网络司法拍卖的平台共有7家&#xff0c;其中阿里资产司法拍卖平台的挂拍量最大。 阿里法拍房 阿里法拍房数据显示2017年&#xff0c;全国法拍房9000套&#xff1b;2018年&a…

HuatuoGPT模型介绍

文章目录 HuatuoGPT 模型介绍LLM4Med&#xff08;医疗大模型&#xff09;的作用ChatGPT 存在的问题HuatuoGPT的特点ChatGPT 与真实医生的区别解决方案用于SFT阶段的混合数据基于AI反馈的RL 评估单轮问答多轮问答人工评估 HuatuoGPT 模型介绍 HuatuoGPT&#xff08;华佗GPT&…

Web请求与响应

目录 Postman Postman简介 Postman的使用 请求 简单参数 实体参数 数组参数 集合参数 日期参数 Json参数 路径参数 响应 ResponseBody 统一响应结果 Postman Postman简介 postman是一款功能强大的网页调试与发送网页http请求的Chrome插件&#xff0c;常用于进行…

故障排查:shell脚本输出乱码

博客主页&#xff1a;https://tomcat.blog.csdn.net 博主昵称&#xff1a;农民工老王 主要领域&#xff1a;Java、Linux、K8S 期待大家的关注&#x1f496;点赞&#x1f44d;收藏⭐留言&#x1f4ac; 目录 故障详情故障原因解决方法iconv命令介绍 故障详情 最近的工作中遇到一…

C语言:指向数组的指针和指向数组元素的指针

相关阅读 C语言https://blog.csdn.net/weixin_45791458/category_12423166.html?spm1001.2014.3001.5482 指向数组的指针和指向数组元素的指针常常被混淆&#xff0c;或者笼统地被称为数组指针&#xff0c;但它们之间是有差别的&#xff0c;本文就将对此进行讨论。 下面的代码…

Java设计模式:工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…

第五讲观测值中与卫星、接收机有关的误差 第六讲观测值中与信号传播路径有关的误差以及电离层、对流层相关模型 | GNSS(RTK)课程学习笔记day3

说明&#xff1a;以下笔记来自计算机视觉life吴桐老师课程&#xff1a;从零掌握GNSS、RTK定位[链接]&#xff0c;从零掌握RTKLIB[链接]。非原创&#xff01;且笔记仅供自身与大家学习使用&#xff0c;无利益目的。 第五讲 观测值中与卫星、接收机有关的误差 卫星轨道误差 由卫…

Kafka-Kafka核心参数详解

Kafka的HighLevel API使用是非常简单的&#xff0c;所以梳理模型时也要尽量简单化&#xff0c;主线清晰&#xff0c;细节慢慢扩展。 Kafka提供了两套客户端API&#xff0c;HighLevel API和LowLevel API。 HighLevel API封装了kafka的运行细节&#xff0c;使用起来比较简单&…

jQuery实现轮播图代码

简述 一个简单的jQuery轮播图代码,首先,定义了一个slideshow-container的div容器,其中包含了所有轮播图幻灯片。每个幻灯片都包含一个mySlides的类名,并且使用CSS将其隐藏。然后,使用JavaScript代码来控制幻灯片的显示和隐藏。在showSlides()函数中,遍历所有幻灯片并将它…

【项目管理】redmine

Redmine是用Ruby开发的基于web的项目管理软件&#xff0c;是用ROR框架开发的一套跨平台项目管理系统&#xff0c;据说是源于Basecamp的ror版而来&#xff0c;支持多种数据库&#xff0c;有不少自己独特的功能&#xff0c;例如提供wiki、新闻台等&#xff0c;还可以集成其他版本…

Flutter实现丝滑的滑动删除、移动排序等-Dismissible控件详解

文章目录 Dismissible 简介使用场景常用属性基本用法举例注意事项 Dismissible 简介 Dismissible 是 Flutter 中用于实现可滑动删除或拖拽操作的一个有用的小部件。主要用于在用户对列表项或任何其他可滑动的元素执行删除或拖动操作时&#xff0c;提供一种简便的实现方式。 使…

大数据处理与分析-Spark

导论 (基于Hadoop的MapReduce的优缺点&#xff09; MapReduce是一个分布式运算程序的编程框架&#xff0c;是用户开发“基于Hadoop的数据分析应用”的核心框架 MapReduce是一种用于处理大规模数据集的编程模型和计算框架。它将数据处理过程分为两个主要阶段&#xff1a;Map阶…

(2021|EMNLP,CLIP,CLIPScore,RefCLIPScore)CLIPScore:图像标题的无参考评估指标

CLIPScore: A Reference-free Evaluation Metric for Image Captioning 公z号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. CLIPScore 4. 标题评估基准 …