zoukankan      html  css  js  c++  java
  • uva 10118,记忆化搜索

    这个题debug了长达3个小时,acm我不能放弃,我又回来了的第一题!

    一开始思路正确,写法不行,结果越改越乱

    看了网上某神的代码,学习了一下

    coding+debug:4小时左右,记忆化搜索+dp类型第一题

    /*
     * Author:  Bingo
     * Created Time:  2015/3/2 21:23:20
     * File Name: uva10118.cpp
     */
    #include <iostream>
    #include <cstdio>
    #include <cstdlib>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <string>
    #include <vector>
    #include <stack>
    #include <queue>
    #include <set>
    #include <time.h>
    using namespace std;
    const int maxint = -1u>>1;
    int dp[45][45][45][45];
    int a[4][45];
    int f[5];
    int n;
    int ans;
    int ok(int i,int j,int p,int q){
        int m[500];
        memset(m,0,sizeof(m));
        int top=0;
        for (int t=0;t<i;t++)
            m[top++]=a[0][t];
        for (int t=0;t<j;t++)
            m[top++]=a[1][t];
        for (int t=0;t<p;t++)
            m[top++]=a[2][t];
        for (int t=0;t<q;t++)
            m[top++]=a[3][t];
        sort(m,m+top);
        int cnt=0,tans=0;
        for (int t=0;t<top;){
            if (m[t]==m[t+1]){
                tans++;
                t+=2;
            }else {
                cnt++;
                t++;
            }
        }
        if (cnt<=5){
            ans=max(ans,tans);
            return 1;
        }
        return 0;
    }
    int dfs(int i,int j,int p,int q){
        if (i==n&&j==n&&p==n&&q==n) return 0;
        if (i<n){
            i++;
            if(ok(i,j,p,q)) {
                if (dp[i][j][p][q]){
                    ans=max(ans,dp[i][j][p][q]);
                    dp[i][j][p][q]=ans;
                }else {dp[i][j][p][q]=ans;dfs(i,j,p,q);}
            }
        }
        if (j<n){
            j++;
            if(ok(i,j,p,q)) {
                if (dp[i][j][p][q]){
                    ans=max(ans,dp[i][j][p][q]);
                    dp[i][j][p][q]=ans;
                }else {dp[i][j][p][q]=ans;dfs(i,j,p,q);}
            }
        }
        if (p<n){
            p++;
            if(ok(i,j,p,q)) {
                if (dp[i][j][p][q]){
                    ans=max(ans,dp[i][j][p][q]);
                    dp[i][j][p][q]=ans;
                }else {dp[i][j][p][q]=ans;dfs(i,j,p,q);}
            }
        }
        if (q<n){
            q++;
            if(ok(i,j,p,q)) {
                if (dp[i][j][p][q]){
                    ans=max(ans,dp[i][j][p][q]);
                    dp[i][j][p][q]=ans;
                }else {dp[i][j][p][q]=ans;dfs(i,j,p,q);}
            }
        }
    }
    int main () {
        while(cin>>n&&n){
            for (int i=0;i<n;i++) {
                cin >> a[0][i]>>a[1][i]>>a[2][i]>>a[3][i];
            }
            memset(dp,0,sizeof(dp));
            ans=0;
            memset(f,0,sizeof(f));
            //ok(3,3,3,3);
            dfs(0,0,0,0);
            cout << ans<<endl;
        }
        return 0;
    }
    View Code
  • 相关阅读:
    .XamlReader.Load()解决给定编码中的字符无效与无法创建未知类型
    ie中jQuery无法解析xml文件的解决方案[转帖]
    关于BI
    关天response.setContentType()和application/json
    win7 exe程序icon消失
    关于spring的p标签(转)
    人生的阶段(转)
    Firefox高版本中alert样式问题
    IDM606注册
    Java 线程池
  • 原文地址:https://www.cnblogs.com/acbingo/p/4310443.html
Copyright © 2011-2022 走看看