SW练习_二亲数_DP

本文介绍了一种使用递归加Map保存中间过程的算法实现方式,通过具体实例展示了如何在Java中运用递归和Map来解决复杂的问题,特别是在处理大量重复计算时的优化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

递归+map保存中间过程

package info.frady.real;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
import java.util.Map;
import java.util.StringTokenizer;

public class ErQinshu_D20200710 {//要递归处理下
    //static long[][][] f;//  0保存-1   1保存0  2保存1
    static Map<String,Long> f;
    public static void main(String[] args) throws Exception{
        //System.setIn(new FileInputStream("C:\\Users\\86153\\Desktop\\SW\\二亲数\\test_input.txt"));
        //System.setIn(new FileInputStream("C:\\Users\\86153\\Desktop\\SW\\二亲数\\sample_input.txt"));
        System.setIn(new FileInputStream("C:\\Users\\86153\\Desktop\\SW\\二亲数\\eval_input.txt"));
        BufferedReader reader=new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st=new StringTokenizer(reader.readLine());

        int T=Integer.parseInt(st.nextToken());
        for (int t = 0; t <T ; t++) {
            long start=System.currentTimeMillis();
            st=new StringTokenizer(reader.readLine());
            int K=Integer.parseInt(st.nextToken());//十进制的数字
            K=Math.abs(K);
            int R=Integer.parseInt(st.nextToken());//字符串的长度
            f=new HashMap<String,Long>();
            //f=new long[K+1][R+1][3];//  0保存-1   1保存0  2保存1
            if(K==0){
                System.out.printf("#%d %d\n",(t+1),1);
                continue;
            }

            long count=0;
            for (int i = 1; i <=R ; i++) {
                count=count+p(K,i,0)+p(K,i,1)+p(K,i,2);
            }
            //System.out.println("预算时间"+(System.currentTimeMillis()-start));
            //System.out.println("运算次数 "+f.size());
            System.out.printf("#%d %d\n",(t+1),count);
        }

        reader.close();
    }

    public static long p(int k,int r,int index){

            String key = k + "_" + r + "_" + index;
            if (f.get(key) != null) {
                return f.get(key);
            }
            if (k == 0 || r == 0) {
                f.put(key,0l);
                return 0;
            }
            if (k == 1 && index == 0) {//数字1,长度为r,以-1结尾
                f.put(key,1l);
                return 1;
            }
            if (k == 1 && index == 1) {//数字1,长度为r,以0结尾
                f.put(key,0l);
                return 0;
            }
            if ((k + 1) % 2 == 0) {
                if (index == 0) {
                    f.put(key, p((k + 1) / 2, r - 1, 0) + p((k + 1) / 2, r - 1, 1) + p((k + 1) / 2, r - 1, 2));
                    //c=c+f[k][r][index];
                }

            }
            if ((k) % 2 == 0) {
                if (index == 1) {
                    f.put(key, p((k) / 2, r - 1, 0) + p((k) / 2, r - 1, 1) + p((k) / 2, r - 1, 2));
                    //c=c+f[k][r][index];
                }
            }
            if ((k - 1) % 2 == 0) {
                if (index == 2) {
                    f.put(key, p((k - 1) / 2, r - 1, 0) + p((k - 1) / 2, r - 1, 1) + p((k - 1) / 2, r - 1, 2));
                    // c=c+f[k][r][index];
                }

            }
            if(f.get(key)==null){
                //System.out.printf("%s \n",key);
                f.put(key,0l);
            }
            return f.get(key);

    }
}
预算时间63
运算次数 300
#1 50
预算时间0
运算次数 447
#2 49
预算时间0
运算次数 597
#3 97
预算时间0
运算次数 591
#4 48
预算时间0
运算次数 741
#5 143
预算时间0
运算次数 738
#6 95
预算时间0
运算次数 888
#7 142
预算时间0
运算次数 732
#8 47
预算时间0
运算次数 1029
#9 187
#10 1
预算时间140
运算次数 47853
#11 28779
预算时间0
运算次数 1155
#12 136
预算时间0
运算次数 1311
#13 229
预算时间16
运算次数 3027
#14 517
预算时间0
运算次数 2481
#15 776
预算时间16
运算次数 7392
#16 2873
预算时间16
运算次数 5235
#17 5369
预算时间78
运算次数 18576
#18 9357
预算时间31
运算次数 28584
#19 28949
预算时间78
运算次数 29541
#20 608
预算时间844
运算次数 369768
#21 61342
预算时间266
运算次数 330852
#22 143485
预算时间219
运算次数 259572
#23 286751
预算时间109
运算次数 221493
#24 3598072
预算时间187
运算次数 222078
#25 21931400
预算时间938
运算次数 814971
#26 5943927
预算时间125
运算次数 237471
#27 1142905149
预算时间578
运算次数 313836
#28 40096123
预算时间468
运算次数 607689
#29 87610899
预算时间891
运算次数 777435
#30 37880707

 

<think>嗯,用户问的是SW_AP和SW_DP访问的含义、定义、作用以及调试协议。首先,我需要回忆一下ARM Coresight架构的相关知识。根据之前的引用,特别是引用[3]和[4],DP是Debug Port,AP是Access Port。SW可能指的是Serial Wire,也就是SWD协议。 首先,SW_DP应该是指Serial Wire Debug Port,属于DP的一种类型,另一种是JTAG-DPSW_DP使用两线式接口(SWDIO和SWCLK),而JTAG-DP使用传统的JTAG四线接口。SW_DP的作用是通过SWD协议与调试器通信,负责传输命令和据,管理AP的访问。需要确认引用中的内容,比如引用[5]提到STM32的调试接口JTAG-DPSW-DP,说明这两个是DP的不同实现。 然后,SW_AP可能指的是通过SWD协议访问的AP,比如MEM-AP。AP的类型取决于连接的组件,比如Cortex-M可能使用AHB-AP。根据引用[4],AP的类型区分是基于不同的接口,如Debug APB或AHB-AP。SW_AP可能不是官方术语,而是指通过SW-DP访问的AP。需要解释AP的作用,如MEM-AP用于访问内存,JTAG-AP用于控制JTAG链。 调试协议方面,SWD是主要的,需要说明其帧结构,如起始位、APnDP位、RnW位等,引用[5]中有详细描述。这部分要结合用户提供的命令头结构,比如bit0是Start,bit1是APnDP,bit2是RnW,这些在SWD协议中如何工作。 还要注意用户可能混淆了SW_AP和SW-DP,需要明确区分两者的层次。DP是调试端口,负责与外部调试器通信,而AP是连接到内部总线的接口,负责具体的内存或寄存器访问。SW-DP属于DP的一种,而AP可能有不同类型,如MEM-AP,通过DP进行访问。 需要确保回答结构清晰,分点解释定义、作用、调试协议,并引用提供的参考资料。可能用户的应用场景是在STM32调试中遇到SWD配置问题,或者想了解如何通过SWD访问不同的AP。因此,在回答中加入配置示例或寄存器定义,如引用[2]中的GPIO重映射宏,可以帮助用户理解实际应用。 最后,生成的相关问题需要围绕SWD协议、配置方法、与JTAG的区别以及调试工具的选择,这些是用户可能进一步感兴趣的方面。</think>### SW_AP与SW_Debug Port(SW-DP)的定义与作用解析 #### 一、基本定义 1. **SW-DP(Serial Wire Debug Port)** 是ARM Coresight调试架构中的**调试端口(Debug Port)**,使用**两线式SWD协议**(SWDIO据线 + SWCLK时钟线)与调试器通信[^5]。其核心作用是通过精简的物理接口实现调试命令传输,并通过**MEM-AP**(Memory Access Port)访问芯片内部资源[^1][^3]。 2. **SW-AP(Serial Wire Access Port)** 并非独立组件,而是指通过SW-DP访问的**AP(Access Port)**。AP是调试组件与芯片内部总线(如AHB/APB)的接口,例如: - **MEM-AP**:用于直接访问内存/寄存器空间[^4] - **JTAG-AP**:用于控制JTAG链上的设备 Cortex-M系列常用**AHB-AP**实现调试访问[^4]。 #### 、层次化调试架构 调试系统通过三级结构实现访问: ``` 调试器 ↔ SW-DP ↔ AP(如MEM-AP) ↔ 芯片内部总线 ``` SW-DP负责协议解析,AP负责总线适配[^3]。 #### 三、SWD协议关键特性 协议帧结构包含以下关键字段(引用自调试波形分析[^5]): ``` Start | APnDP | RnW | Addr | Parity | Stop ``` - **APnDP位**:区分访问目标是DP寄存器(0)还是AP寄存器(1) - **RnW位**:控制读/写操作 - **地址映射**:通过A[3:2]选择寄存器bank #### 四、典型应用场景 1. **STM32调试接口配置** 通过重映射寄存器选择调试模式(引用代码段[^2]): ```c #define GPIO_Remap_SWJ_Disable 0x00300400 // 完全禁用JTAG+SW ``` 禁用JTAG后可释放GPIO引脚。 2. **AP访问流程示例**: - 通过SW-DP发送APACC命令(APnDP=1) - 选择MEM-AP的CSW寄存器配置总线位宽 - 通过TAR寄存器设置目标地址 - 通过DRW寄存器读写据[^3] #### 五、调试协议对比 | 特性 | SWD | JTAG | |-----------|-------------------|-----------------| | 引脚量 | 2线 | 4线+可选TRST | | 协议效率 | 帧结构更紧凑 | 状态机转换复杂 | | 拓扑支持 | 点对点 | 支持多设备链 | | 典型应用 | Cortex-M系列 | Cortex-A/R系列 |
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值