1. 程式人生 > >想起我還有博客

想起我還有博客

acc break algorithm 分享 class 不能 har out 情況

做點水題壓壓驚

傳紙條

從(1,1)傳紙條到(m,n),經過後返回時不能經過

四維dp,f[i][j][k][p]表示從(i,j)到(k,p)的答案,顯然

f[i][j][k][p]=max(f[i-1][j][k-1][p],max(f[i-1][j][k][p-1],max(f[i][j-1][k-1][p],f[i][j-1][k][p-1])))+a[i][j]+a[k][p]

技術分享圖片
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include
<cmath> #include<algorithm> #define ll long long using namespace std; const int maxn=55; inline int read(){ int x=0,k=1;char ch=getchar(); while(ch<0||ch>9){if(ch==-) k=-1;ch=getchar();} while(ch>=0&&ch<=9){x=(x<<3)+(x<<1)+ch-0;ch=getchar();}
return k*x; } int a[maxn][maxn],f[maxn][maxn][maxn][maxn]; int main(){ // freopen(".in","r",stdin); // freopen(".out","w",stdout); int n,m; n=read();m=read(); for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) a[i][j]=read(); for(int i=1;i<=n;i++) for(int
j=1;j<=m;j++) for(int k=1;k<=n;k++) for(int p=j+1;p<=m;p++){ f[i][j][k][p]=max(f[i-1][j][k-1][p],max(f[i-1][j][k][p-1],max(f[i][j-1][k-1][p],f[i][j-1][k][p-1])))+a[i][j]+a[k][p]; } cout<<f[n][m-1][n-1][m]; return 0; }
View Code

掃雷

兩列方格,給第二列數字,問第一列有幾種可能

本來是dp的但是太水了,最多的情況是第一個是1,則最多有2種,在依次判斷一下,不符合的減去就行了

技術分享圖片
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define ll long long
using namespace std;
const int maxn=10005;
inline int read(){
    int x=0,k=1;char ch=getchar();
    while(ch<0||ch>9){if(ch==-) k=-1;ch=getchar();}
    while(ch>=0&&ch<=9){x=(x<<3)+(x<<1)+ch-0;ch=getchar();}
    return k*x;
}
int a[maxn],b[maxn],ans=2;
void pd(int n){
    for(int i=2;i<=n+1;i++){
        b[i]=a[i-1]-b[i-1]-b[i-2];
        if(b[i]!=1&&b[i]!=0){
            ans--;
            break;
        }
        if(i==n+1&&b[i]!=0) ans--;
    }
}
int main(){
//    freopen(".in","r",stdin);
//    freopen(".out","w",stdout);
    int n;
    n=read();
    for(int i=1;i<=n;i++) a[i]=read();
    b[1]=0;pd(n);
    b[1]=1;pd(n);
    cout<<ans;
    return 0;
}
View Code

想起我還有博客