在高度为500且宽度为10 ^ 5的矩形空间中,我们给出N个点.
我们应该找出最大的子矩形,其基部位于x轴上,并且不包含其正确内部的任何点(但可以在其边缘包含它们).
我尝试了一种O(宽度^ 2)算法:
#include <iostream>
#include <algorithm>
const int nWidth = 100000;
const int nHeight = 500;
int main(){
int *nMaxHeights = new int[nWidth];
std::fill (nMaxHeights, nMaxHeights+nWidth, nHeight);
int N;
std::cin >> N;
for (int x,y,iii=0; iii < N; iii++){
std::cin >> x >> y;
nMaxHeights[x] = std::min(y+1, nMaxHeights[x]);
}
int maxArea = 0;
for (int jjj,iii=0; iii < nWidth; iii++){
for (jjj=iii; jjj < nWidth; jjj++){
if (nMaxHeights[jjj] < nMaxHeights[iii])
break;
}
maxArea = std::max((jjj-iii+1)*nMaxHeights[iii],maxArea); …
Run Code Online (Sandbox Code Playgroud) 我试图用Haskell实现Braun树,定义如下:
{-# LANGUAGE GADTs #-}
{-# LANGUAGE DataKinds #-}
{-# LANGUAGE PolyKinds #-}
{-# LANGUAGE KindSignatures #-}
{-# LANGUAGE TypeOperators #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeApplications #-}
{-# LANGUAGE ScopedTypeVariables #-}
data BraunTree (n :: Nat) a where
Empty :: BraunTree 0 a
Fork :: a -> BraunTree n a ->
BraunTree m a ->
Either (n :~: m) (n :~: (m + 1)) ->
BraunTree (n + m + 1) a
Run Code Online (Sandbox Code Playgroud)
现在,我试图尝试如何“类型安全”地将内容插入此树。
insert …
Run Code Online (Sandbox Code Playgroud) 我想阅读STDIN中换行符分隔的字符串列表,直到看到一个新行并且我想要一个类型的动作IO [String]
.这是我如何使用递归来做到这一点:
myReadList :: IO String
myReadList = go []
where
go :: [String] -> IO [String]
go l = do {
inp <- getLine;
if (inp == "") then
return l;
else go (inp:l);
}
Run Code Online (Sandbox Code Playgroud)
然而,这种使用方法模糊了可读性,并且是一种非常普遍的模式,理想情况下,人们希望将其抽象出来.
所以,这是我的尝试:
whileM :: (Monad m) => (a -> Bool) -> [m a] -> m [a]
whileM p [] = return []
whileM p (x:xs) = do
s <- x
if p s
then do
l <- whileM p xs
return (s:l) …
Run Code Online (Sandbox Code Playgroud) 假设我想创建一个包含两个组件的网页,比如a Navbar
和a Body
.这两个组件不相互作用,可以独立开发.所以,我有两个榆树文件,每个文件都有以下组件:
type Model = ...
type Msg = ...
init : (Model, Cmd Msg)
update : Msg -> Model -> (Model, Cmd Msg)
view : Model -> Html Msg
Run Code Online (Sandbox Code Playgroud)
假设它们都工作正常,我们如何组合它们来制作一个包含这两个组件的程序?
我试着写这样的东西:
type Model = {body : Body.Model , navbar : Navbar.Model}
type Msg = BodyMsg Body.Msg | NavbarMsg Navbar.Msg
view : Model -> Html Msg
view model = div [] [Body.view model.body, Navbar.view model.navbar]
update : Msg -> Model -> (Model, Cmd Msg)
update = ... …
Run Code Online (Sandbox Code Playgroud) 我有以下定义
Inductive subseq : list nat -> list nat -> Prop :=
| empty_subseq : subseq [] []
| add_right : forall y xs ys, subseq xs ys -> subseq xs (y::ys)
| add_both : forall x y xs ys, subseq xs ys -> subseq (x::xs) (y::ys)
.
Run Code Online (Sandbox Code Playgroud)
使用这个,我希望证明以下引理
Lemma del_l_preserves_subseq : forall x xs ys, subseq (x :: xs) ys -> subseq xs ys.
Run Code Online (Sandbox Code Playgroud)
所以,我试着看看subseq (x :: xs) ys
做的证明destruct H
.
Proof.
intros. induction H.
Run Code Online (Sandbox Code Playgroud)
3 …
Run Code Online (Sandbox Code Playgroud) 显然,Agda中有一些功能称为积极性检查,即使type-in-type
启用也可以显然保持系统声音.
我很想知道这是什么,但是Agda手册没有回答这个问题,只解释了如何关闭它.
在午餐桌上,我无意中听到这是关于类型理论的极性,但这就是我所知道的.我没有在网上找到任何解释这个概念的东西以及为什么它有助于保持稳健性.任何可理解的解释将不胜感激.
显然,在Haskell中有一种称为无限类型的东西.
例如,当我尝试iterate concat
GHCi时,我得到了这个:
*Main> iterate concat
<interactive>:24:9: error:
• Occurs check: cannot construct the infinite type: a ~ [a]
Expected type: [a] -> [a]
Actual type: [[a]] -> [a]
• In the first argument of ‘iterate’, namely ‘concat’
In the expression: iterate concat
In an equation for ‘it’: it = iterate concat
• Relevant bindings include
it :: [a] -> [[a]] (bound at <interactive>:24:1)
Run Code Online (Sandbox Code Playgroud)
我的问题是,究竟什么是无限类型?它们如何适应类型理论以及我可以从哪些资源中了解它们?有没有允许无限类型的编程语言?
haskell ×3
algorithm ×2
type-theory ×2
agda ×1
chemistry ×1
composition ×1
coq ×1
elm ×1
graph ×1
loops ×1
monads ×1
proof ×1
rectangles ×1
recursion ×1