poj 3276 Face The Right Way 递推

地址  http://poj.org/problem?id=3276

解法

依次遍历一次翻转K(1~N)头牛的办法 最后得出转数最小的答案  复杂度是 N*N*N

但是在模拟一次翻转K头牛的时候 我们可以优化模拟翻转的过程 优化效率

如图 当K = 3 每次翻转3头牛的时候

第0头牛 朝后 之前影响到第0头牛的点击数为0 所以我们需要点击1次 将牛朝前

第1头牛 朝后 之前影响第1头牛的点击数为1 所以牛已经朝前不必点击

第2头牛 朝前 之前影响第2头牛的点击数为1 所以需要点击1次  将牛朝前

第3头牛 朝后 之前影响第3头牛的点击数为1 牛已经朝前(之前其实点击了两次 但是第0头牛的点击只影响0 1 2 这3头牛)

第4头牛 朝前 之前影响第4头牛的点击数为1 牛朝后,需要点击1次

第5头牛 朝后 之前影响第5头牛的点击数为1 牛朝前

第6头牛 朝后 之前影响第6头牛的点击数为1 牛朝前

点击牛的个数  0  2 4 ,共3次点击.

如果我们在遍历到第i头牛的时候 已经记录之前能影响到i头牛的点击数 就不必每次去模拟一次点击后牛的朝向

那么 整体复杂度就从 n*n*n 降低到n*n

代码如下:

#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int MAX_N = 5e3 + 10;
int f[MAX_N]; int N;
int d[MAX_N];

int getans(int k)
{
    memset(f, 0, sizeof(f));

    int sum = 0; int res = 0;
    for (int i = 0; i + k <= N; i++) {
        //第i头牛 和之前能影响到它的点击数和 如果余1 则说明该牛朝后 需要点击
        if ((d[i] + sum) % 2 == 1) {
            f[i] = 1; res++;
        }
        sum += f[i];
        //i向后推移 则减去影响不到i头牛的点击数字
        if (i - k + 1 >= 0) sum -= f[i - k + 1];
    }

    //最后k-1头牛是不必点击的 只需要查看他们被影响的点击和 判断是否朝前
    for (int i = N - k + 1; i < N; i++) {
        if ((d[i] + sum) % 2 == 1)
            return -1;
        if (i - k + 1 >= 0) sum -= f[i - k + 1];
    }

    return res;
}

int main()
{
    while (cin >> N) {
        for (int i = 0; i < N; i++) {
            char c; cin >> c;
            if (c == ‘F‘) d[i] = 0;
            else d[i] = 1;
        }
        int K = 1; int M = N;
        for (int k = 1; k <= N; k++) {
            int m = getans(k);
            if (m >= 0 && M > m) {
                M = m; K = k;
            }
        }
        cout << K << " " << M << endl;
    }

    return 0;
}

原文地址:https://www.cnblogs.com/itdef/p/12091519.html

时间: 2024-11-13 08:16:56

poj 3276 Face The Right Way 递推的相关文章

POJ 3744 Scout YYF I 简单递推

题意就是 一个人, 站在坐标为1的点处,然后每次走路有p的概率一下走出去坐标1,1-p的概率一下走出去坐标2 路上某些点(n < 10)有雷,问这个人最终迈过这些雷不被炸的概率是多大 想一下就知道这些雷之间实际上是独立不相关的 可以分段考虑 然后互相之间乘一下就行 假设有个雷在x点 现在人在坐标1 然后不踩雷就得从1点到x-1点 并且从x-1点迈出坐标2到x+1 从x-1迈出坐标2到x+1的概率是1-p 之前1到x-1这段是没有任何雷的.就可以进行普通的递推了 a_n = a_(n-1) * p

POJ 2229 sumset ( 完全背包 || 规律递推DP )

题意 : 给出一个数 n ,问如果使用不同 2 的幂的和来组成这个数 n 有多少种不同的方案? 分析 :  完全背包解法 将问题抽象==>有重量分别为 2^0.2^1.2^2-2^k 的物品且每种物品可无限取,问有多少种方案来填满容量为 n 的背包? 之前并不知道背包还能用来计数....... 有一道裸的背包计数问题可以作为练习 ==> HDU 1284 定义 dp[ i ][ j ] 为前 i 种物品组成总重量 j 的方案数为多少.初始化为 dp[ 0 ][ 0 ] = 1 其他为 0 则状

POJ 1664 放苹果 (递推)

题目链接:http://poj.org/problem?id=1664 dp[i][j]表示i个盘放j个苹果的方案数,dp[i][j] 可以由 dp[i - 1][j] 和 dp[i][j - i] 递推而来. 当盘子的个数大于等于苹果的个数: dp[i - 1][j] :i - 1个盘子放j个苹果,说明i个盘子里最少有一个盘子是空的 dp[i][j - i] :i个盘子都放了苹果,说明有j - i个苹果是随便放置的 否则: dp[i][j] = dp[i - 1][j] 然后没有苹果的盘子的方

POJ 3517 And Then There Was One(约瑟夫环-递推or模拟)

POJ 3517 题目: n  k m 数字1到n成环,先叉数字m,往下数k个,直到最后只有一个数字,输出它. 链表模拟: #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<cmath> #include<vector> #incl

POJ 2506 Tiling(递推+大整数加法)

http://poj.org/problem?id=2506 题意: 思路:递推.a[i]=a[i-1]+2*a[i-2]. 计算的时候是大整数加法.错了好久,忘记考虑1了...晕倒. 1 #include<iostream> 2 #include<string> 3 #include<cstring> 4 #include<cstdio> 5 using namespace std; 6 7 int n; 8 char s[255][255]; 9 10

poj 2506 Tiling 递推

题目链接: http://poj.org/problem?id=2506 题目描述: 有2*1和2*2两种瓷片,问铺成2*n的图形有多少种方法? 解题思路: 利用递推思想,2*n可以由2*(n-1)的状态加上一块竖放2*1的瓷片转移得来,也可以由2*(n-2)的状态加上一块2*2的瓷片或者加上两块横放的2*1的瓷片转移得来. 可得出递推公式:dp[n] = dp[n-1] + dp[n-2]*2: ac秘诀: (1):从输出样例可以看出要用大数来表示,大概需要90位左右. (2):2*0不是零种

[ACM] POJ 2506 Tiling (递推,大数)

Tiling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7487   Accepted: 3661 Description In how many ways can you tile a 2xn rectangle by 2x1 or 2x2 tiles? Here is a sample tiling of a 2x17 rectangle. Input Input is a sequence of lines,

POJ 1205 Water Treatment Plants(递推)

题意   建设一条河岸的污水处理系统  河岸有n个城市   每个城市都可以自己处理污水 V   也可以把污水传到相邻的城市处理 >或<   除了你传给我我也传给你这种情况   其它都是合法的   两端的城市不能传到不存在的城市 令d[i]表示有i个城市时的处理方法数  最后一个城市的处理方法有 1.V 自己处理自己的  与前i-1个城市的处理方法无关  有d[i-1]种方法 2.< 给左边的城市去处理  也与前i-1个城市的处理方法无关  把自己的污水给第i-1个城市就行了  有d[i-

poj 2229 【完全背包dp】【递推dp】

poj 2229 Sumsets Time Limit: 2000MS   Memory Limit: 200000K Total Submissions: 21281   Accepted: 8281 Description Farmer John commanded his cows to search for different sets of numbers that sum to a given number. The cows use only numbers that are an