首页 > 其他分享 >动态规划专题4

动态规划专题4

时间:2023-12-10 09:14:22浏览次数:27  
标签:status 10 专题 time memory test Accepted 规划 动态

A.游戏王   时间:1s   空间:256M 题目描述 大哈是个游戏王,尽管他的水平一言难尽,但他却总是这样自我称呼。小羽说如果你能把这个游戏通关了,你才算是个真的游戏王。这个游戏一开始你有n个连在一起的颜色块,第i个颜色块的颜色为ai​。如果从i到j的颜色都一样,就说明i到j属于同一个连通块。比如[5,5,5]属于同一个连通块,[4,3,9,9]有3个连通块。游戏开始前大哈可以选择任意一个位置作为起始点,然后开始游戏。游戏的每一轮大哈可以将包含起始点的连通块的颜色变成任意一种其他的颜色。问大哈能将整个数组变成从1到n的连通块所需要的最少回合数。   输入格式 第一行一个整数n(1≤n≤5000)   第二行n个整数ai​(1≤ai​≤5000)       输出格式 一个整数代表最少回合数      

样例输入

4 5 2 2 1  

 

样例输出

2   ①n个连在一起的连通块 ②选择任意一个起始点开始;包含起始点   (1)一段连续的相同元素可以看成一个值 (2)①区间为1    1,1符合一个连通块内。          ②区间为2的时候{相同时:f[l][r]=f[l+1][r-1]+1;不相同时:f[l][r]=min(f[l+1][r],f[l][r-1])+1}。    
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=5050;
 4 int n,f[N][N],a[N],last,m;
 5 int main(){
 6     cin>>n;
 7     for(int i=1,x;i<=n;i++){
 8         cin>>x;
 9         if(x!=last){
10             a[m++]=x;
11         }
12         last=x;
13     }
14     for(int len=2;len<=m;len++){
15         for(int l=1;l+len-1<=m;l++){
16             int r=l+len-1;
17             if(a[l]==a[r]) f[l][r]=f[l+1][r-1]+1;
18             else f[l][r]=min(f[l+1][r],f[l][r-1])+1;
19         }
20     }
21     cout<<f[1][m];
22     return 0;
23 }
24 
25 编译结果
26 compiled successfully
27 time: 178ms, memory: 58252kb, score: 100, status: Accepted
28 > test 1: time: 0ms, memory: 3372kb, points: 10, status: Accepted
29 > test 2: time: 1ms, memory: 5752kb, points: 10, status: Accepted
30 > test 3: time: 99ms, memory: 58252kb, points: 10, status: Accepted
31 > test 4: time: 0ms, memory: 10596kb, points: 10, status: Accepted
32 > test 5: time: 67ms, memory: 46044kb, points: 10, status: Accepted
33 > test 6: time: 0ms, memory: 8752kb, points: 10, status: Accepted
34 > test 7: time: 2ms, memory: 8676kb, points: 10, status: Accepted
35 > test 8: time: 4ms, memory: 8640kb, points: 10, status: Accepted
36 > test 9: time: 3ms, memory: 8680kb, points: 10, status: Accepted
37 > test 10: time: 2ms, memory: 8372kb, points: 10, status: Accepted

 

B.字符选择

题目描述

Alice 和 Bob 在玩游戏。

给出一个长度为偶数的,非空的且仅含小写字母的字符串 �s。每个玩家还拥有一个初始为空的字符串。

Alice 先手,两名玩家交替行动。在一次行动中,玩家可以取 �s 首或尾字符,将其从 �s 中移除后加入到自己的字符串的 最前面。

当 �s 为空时游戏结束,拥有字典序更小的字符串的玩家获胜。若两名玩家的字符串相等则平局。

若 Alice 和 Bob 都足够聪明,判断谁会取胜,或者游戏为平局。

数据组数 �≤15t≤15,∑∣�∣≤3×103∑∣s∣≤3×103。保证所有输入的 ∣�∣∣s∣ 长度都为偶数。

样例输入1

1 aa

样例输出1

Draw

样例输入2

1 ab

样例输出2

Alice

 

Alice{(l{r,l+1})(max 1);(r{r-1,l})(max 2)}

 

#include<bits/stdc++.h>
using namespace std;
const int N=3e3+10;
string s;
char ar[N];
int f[N][N];
int n;
inline int make(int a,int b,int c){
    if(a!=1) return a;
    return (ar[b]<ar[c]?0:(ar[b]==ar[c]?1:2));
}
inline void solve(){
    cin>>s;
    n=s.size();
    for(int i=0;i<n;i++) ar[i+1]=s[i];
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++){
            f[i][j]=3;
        }
    }
    for(int len=2;len<=n;len+=2){
        for(int l=1;l+len-1<=n;l++){
            int r=l+len-1;
            if(len==2){
                f[l][r]=(ar[l]==ar[r]);
                continue;
            }
            int res=2;
            res=min(res,max(make(f[l+1][r-1],l,r),make(f[l+2][r],l,l+1)));
            res=min(res,max(make(f[l+1][r-1],r,l),make(f[l][r-2],r,r-1)));
            f[l][r]=res;
        }
    }
    if(f[1][n]==0) cout<<"Alice\n";
    else if(f[1][n]==1) cout<<"Draw\n";
    else cout<<"Bob\n";
}
signed main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
    return 0;
}

编译结果
compiled successfully
time: 10ms, memory: 9832kb, score: 100, status: Accepted
> test 1: time: 3ms, memory: 9540kb, points: 10, status: Accepted
> test 2: time: 0ms, memory: 7740kb, points: 10, status: Accepted
> test 3: time: 0ms, memory: 9784kb, points: 10, status: Accepted
> test 4: time: 2ms, memory: 9832kb, points: 10, status: Accepted
> test 5: time: 0ms, memory: 9760kb, points: 10, status: Accepted
> test 6: time: 1ms, memory: 7780kb, points: 10, status: Accepted
> test 7: time: 1ms, memory: 8044kb, points: 10, status: Accepted
> test 8: time: 1ms, memory: 7904kb, points: 10, status: Accepted
> test 9: time: 1ms, memory: 8468kb, points: 10, status: Accepted
> test 10: time: 1ms, memory: 7760kb, points: 10, status: Accepted

 

A.游戏王
时间:1s   空间:256M题目描述大哈是个游戏王,尽管他的水平一言难尽,但他却总是这样自我称呼。小羽说如果你能把这个游戏通关了,你才算是个真的游戏王。这个游戏一开始你有n个连在一起的颜色块,第i个颜色块的颜色为ai​。如果从i到j的颜色都一样,就说明i到j属于同一个连通块。比如[5,5,5]属于同一个连通块,[4,3,9,9]有3个连通块。游戏开始前大哈可以选择任意一个位置作为起始点,然后开始游戏。游戏的每一轮大哈可以将包含起始点的连通块的颜色变成任意一种其他的颜色。问大哈能将整个数组变成从1到n的连通块所需要的最少回合数。
输入格式第一行一个整数n(1≤n≤5000)
第二行n个整数ai​(1≤ai​≤5000)
 
输出格式一个整数代表最少回合数


样例输入4 5 2 2 1 样例输出2
①n个连在一起的连通块②选择任意一个起始点开始;包含起始点
(1)一段连续的相同元素可以看成一个值(2)①区间为1    1,1符合一个连通块内。         ②区间为2的时候{相同时:f[l][r]=f[l+1][r-1]+1;不相同时:f[l][r]=min(f[l+1][r],f[l][r-1])+1}。

#include<bits/stdc++.h>using namespace std;const int N=5050;int n,f[N][N],a[N],last,m;int main(){cin>>n;for(int i=1,x;i<=n;i++){cin>>x;if(x!=last){a[m++]=x;}last=x;}for(int len=2;len<=m;len++){for(int l=1;l+len-1<=m;l++){int r=l+len-1;if(a[l]==a[r]) f[l][r]=f[l+1][r-1]+1;else f[l][r]=min(f[l+1][r],f[l][r-1])+1;}}cout<<f[1][m];return 0;}
编译结果compiled successfullytime: 178ms, memory: 58252kb, score: 100, status: Accepted> test 1: time: 0ms, memory: 3372kb, points: 10, status: Accepted> test 2: time: 1ms, memory: 5752kb, points: 10, status: Accepted> test 3: time: 99ms, memory: 58252kb, points: 10, status: Accepted> test 4: time: 0ms, memory: 10596kb, points: 10, status: Accepted> test 5: time: 67ms, memory: 46044kb, points: 10, status: Accepted> test 6: time: 0ms, memory: 8752kb, points: 10, status: Accepted> test 7: time: 2ms, memory: 8676kb, points: 10, status: Accepted> test 8: time: 4ms, memory: 8640kb, points: 10, status: Accepted> test 9: time: 3ms, memory: 8680kb, points: 10, status: Accepted> test 10: time: 2ms, memory: 8372kb, points: 10, status: Accepted

标签:status,10,专题,time,memory,test,Accepted,规划,动态
From: https://www.cnblogs.com/ghxx/p/17892165.html

相关文章

  • 3.8 使用动态调度、多发射和前瞻利用ILP
    3.8使用动态调度、多发射和前瞻利用ILP我们希望将动态调度、多发射和前瞻结合起来,以Tomasulo算法为基础,构建前瞻执行动态调度的多发射处理器。在动态调度的处理器中,无论是否前瞻,都需要更新控制表,否则会丢失相关性。要实现动态调度的处理器,关键就在于保留站的分配与流水线控制表......
  • 动态DMA映射指南 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api-howto.html动态DMA映射指南作者[email protected]@[email protected]本指南旨在向设备驱动程序编写者介绍如何使用DMAAPI,并提供伪代码示例。有关A......
  • 动态DMA映射使用通用设备 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/dma-api.html动态DMA映射使用通用设备作者[email protected]本文档描述了DMAAPI。要了解API的更详细介绍(以及实际示例),请参阅动态DMA映射指南。该API分为两部分。第一部分描述了......
  • 职业规划做得好,求职少一点烦恼~
    本文首发自公粽hao「林行学长」,欢迎来撩,免费领取20个求职工具资源包。了解校招、分享校招知识的学长来了!试想一下,你和面试官侃侃而谈关于岗位关于经历,接着,面试官问你:”你的未来规划是什么?“这个问题是面试必问环节之一,必经之路。你会怎么回答?问这个问题,面试官想考察什么?考察你对自......
  • 【专题】2023年中国碳金融创新发展白皮书报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=34502原文出处:拓端数据部落公众号本白皮书报告合集是全市场聚焦中国碳金融领域的洞察白皮书。白皮书报告合集中巧妙结合了中国特色与国际经验、理论研究与前沿实践、监管导向与市场声音,全面探讨了在中国碳市场蓬勃发展的时代脉络中,金融力量的角色......
  • 【专题】2023快手母婴行业数据报告PDF合集分享(附原数据表)
    原文链接:https://tecdat.cn/?p=33866原文出处:拓端数据部落公众号品牌一直在思考如何更好地了解消费者的需求,特别是在年轻化和线上消费趋势加强的母婴行业。根据《2023母婴行业数据报告合集》,短视频直播平台成为该行业新的增长点。报告合集显示,母婴商品的消费人数在2022年全年和2......
  • Linux内核开发流程指南 - 3. 早期规划【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/process/3.Early-stage.html3.早期规划在考虑Linux内核开发项目时,很容易就跃跃欲试,开始编码。然而,与任何重要项目一样,成功的基础工作最好是在编写第一行代码之前完成的。在早期规划和沟通上花费一些时间,可以在以后节省更多的时间。3......
  • C/C++ 实现动态资源文件释放
    当我们开发Windows应用程序时,通常会涉及到使用资源(Resource)的情况。资源可以包括图标、位图、字符串等,它们以二进制形式嵌入到可执行文件中。在某些情况下,我们可能需要从可执行文件中提取自定义资源并保存为独立的文件。在这篇博客文章中,我们将讨论如何使用C++和WinAPI实现这个目......
  • mybatis动态sql将字符串转换成数字类型报错
    报错信息org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.exceptions.PersistenceException: ###Errorqueryingdatabase.Cause:java.lang.NumberFormatException:Forinputstring:"xxx" ###Cause:java.lang.NumberFo......
  • 通过数据驱动设计动态的全面预算管理架构
    在过去的20年里,电子表格一直是企业用于规划、预测、预算和管理报告的主要工具,尽管有的企业具备针对财务的系统,但其应用效率和规划技术仍然难以满足市场需求。并且,大部分企业对于财务管理的部署成本相对较低,其可访问性、安全性、及时性都难以保障,随着企业在用户和信息需求方面的增长......