5196: [Usaco2018 Feb]Taming the Herd

题意

一大清早,Farmer John就被木材破裂的声音吵醒了。是这些奶牛们干的,她们又逃出牛棚了!Farmer John已经厌
烦了奶牛在清晨出逃,他觉得受够了:是时候采取强硬措施了。他在牛棚的墙上钉了一个计数器,追踪从上次出逃
开始经过的天数。所以如果某一天早上发生了出逃事件,这一天的计数器就为0;如果最近的出逃是3天前,计数器
读数就为3。Farmer John一丝不苟地记录了每一天计数器的读数。年末到了,Farmer John准备做一些统计。他说
,你们这些奶牛会付出代价的!然而他的某些记录看上去不太对劲……Farmer John想要知道从他开始记录以来发
生过多少次出逃。但是,他怀疑这些奶牛篡改了它的记录,现在他所确定的只有他是从发生出逃的某一天开始记录
的。请帮助他求出,对于每个从他开始记录以来可能发生的出逃次数,他被篡改了的记录条数的最小值。

题解

OZY到此一游,哈哈哈哈哈哈哈。。
直接暴力DP就可以了
n^3的
金组的题真没意思,感觉做多了会变水——FYC

CODE:

#include
#include
#include
#include
#include
using namespace std;
const int N=105;
int g[N][N];
int f[N][N];//前i天,发生了j次 
int n;
int a[N];
int main()
{
    scanf("%d",&n);
    for (int u=1;u<=n;u++)  scanf("%d",&a[u]);
    for (int u=1;u<=n;u++)
    {
        int mx=0;
        for (int i=u;i<=n;i++)
        {
            mx=mx+(a[i]!=(i-u));
            g[u][i]=mx;
            /*printf("%d %d %d\n",u,i,mx);
            system("pause");*/
        }
    }
    memset(f,127,sizeof(f));
    f[0][0]=0;
    for (int u=1;u<=n;u++)
        for (int i=1;i<=n;i++)
        {
            for (int j=0;j1]+g[j+1][u]);
            /*printf("%d %d %d\n",u,i,f[u][i]);
            system("pause");*/
        }
    for (int u=1;u<=n;u++)
        printf("%d\n",f[n][u]);
    return 0;
}

你可能感兴趣的:(dp)